【发布时间】:2019-05-21 22:05:31
【问题描述】:
class Frame<P> 表示像素类型为P 的图像。由于底层数据缓冲区格式具有多种灵活性,迭代其像素的算法并非易事。因此,我想避免在Frame<P>::iterate 中重复代码。
template<typename P>
class Frame {
std::vector<P> buf;
public:
template<typename F>
void iterate(F f) const {
// iterate in a way that is performant for this buffer
// but here i use a simple iteration for demonstration
for(const P& p : buf){
for(int i=0; i<buf.size(); i++){
f(buf.data()[p]);
}
}
}
}
这允许(在const Frame<P>& frame 上):
frame.iterate([](const P& p){ /* ... */ });
但我也想支持(在非常量 Frame<P>& frame 上):
frame.iterate([](P& p){ /* ... */ });std::move(frame).iterate([](P&& p){ /* ... */ });
有没有一种简单的方法可以做到这一点而无需复制iterate 中的代码?
【问题讨论】:
-
不过,还不止这些。您还需要从
&&限定函数中的buf成员中获取std::move_iterator,否则您需要for (auto&& p : buf) { f(forward_like<Self>(p)); }的某种forward_like<Self>(p)函数才能实际移动p元素. -
@Justin 我已经编辑了实现(同时保持最小化)以反映它实际上是在使用指针偏移进行迭代。您认为可以在不重复我编辑的实现的情况下完成吗?我什至不知道成员函数可以是“ref-qualified”。
-
你的新实现意味着什么?
P类型用于索引缓冲区本身,而i完全未使用?您的意思是完全移除外循环吗?
标签: c++ lambda c++14 rvalue-reference perfect-forwarding