c – 避免接受lambda的方法的const / non-const重复
发布时间:2020-12-16 07:23:10 所属栏目:百科 来源:网络整理
导读:class Frame P表示具有类型P的像素的图像.由于基础数据缓冲器格式中的若干灵活性,迭代其像素的算法是非平凡的. template typename P,bool RM = true // P is pixel type; RM = is_row_majorclass Frame { // ... templatetypename F void iterate(F f) { //
class Frame< P>表示具有类型P的像素的图像.由于基础数据缓冲器格式中的若干灵活性,迭代其像素的算法是非平凡的.
template <typename P,bool RM = true> // P is pixel type; RM = is_row_major class Frame { // ... template<typename F> void iterate(F f) { // iterate in a way that is performant for this buffer if (stride == (RM ? size.w : size.h)) { auto n = size.area(); for (index_t k = 0; k < n; k++) { f(view[k]); } } else { auto s = static_cast<index_t>(stride)*(RM ? size.h : size.w); for (index_t k0 = 0; k0 < s; k0 += stride) { auto m = k0 + (RM ? size.w : size.h); for (index_t k = k0; k < m; k++) { f(view[k]); } } } } } 我希望能够调用iterate(fc)const和iterate(f)(分别使用lambda签名fc(const P&)和f(P&)).我可以复制整个函数体并将const附加到签名,但是有更好的方法吗? 解决方法
无法推导出成员函数的常量.但是,使用转发引用可以推断出函数参数的成本.因此,您可以委托将对象类型作为参数并转发所有其他参数的函数.这样重复的代码变得微不足道.如果该函数需要访问私有或受保护的成员,您只需将其设置为(可能是私有的)静态成员:
template <typename T,bool PM = true> class Frame { template <typename F1,typename F2> static void iterateTogether(F1&& f1,F2&& f2) { // actual implementation goes here } public: template <typename F2> void iterateTogether(F2&& other){ iterateTogether(*this,std::forward<F2>(other)); } // ... }; 上面使用的实现还允许参数的不同常量.如果你想将参数限制为实际上只是Frame的特化,你需要约束这个函数,但这很容易完成. 我个人的偏好是无论如何只有琐碎的成员,并将任何非平凡的任务委托给通用算法.我的偏好是类只维护它们的不变量,有趣的用途是通过算法实现的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |