【发布时间】:2018-05-05 17:48:28
【问题描述】:
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 附加到签名中,但有更好的方法吗?
【问题讨论】:
-
这里的thread 有帮助吗? (如果不是,那么我显然没有理解这个问题——你能把它说得更清楚一些,并可能最小化你的例子吗?)
-
@davidhigh 不确定。我经常在简单的吸气剂上使用它。在这里使用
const_cast也安全吗? -
用它做什么?坦率地说,我没有理解这个问题......你能否在你的问题中举例说明你想要做什么,只有两个
operator+=成员,一个 const,一个非 const? -
@davidhigh 对我来说
operator+=本质上是非常量的。我想要的是一个iterateTogether() const而不复制整个方法。 -
为什么不能只拥有一个
iterateTogether函数,即const?从非常量函数调用const成员函数没有问题。
标签: c++ c++11 lambda constants