考虑以下代码:
struct PixelProcessChannelwise {
template<class Op, typename... Args>
void operator()(float *dest, int process_nchannels, Args... srcs) const {
for (int ch = 0; ch < process_nchannels; ch++) {
Op{}(dest, srcs[ch]...);
}
}
};
struct add1_op {
void operator()(float& dst, float x) const {
dst = x + 1;
}
typedef PixelProcessChannelwise processor;
};
void f() {
float f = 1.0;
auto pp = PixelProcessChannelwise();
pp(f, 0, &f);
}
这不会编译,因为在f()
中,pp
不知道要使用哪个操作。我尝试了pp<add1_op>(&f, 0, f);
,但c叫pp没有命名模板。用模板arg调用pp
operator()的正确方法是什么? (我希望它是一个模板arg,以便它内联而不是通过函数指针进行调用。)或者,如果这不起作用,是否有一种有效的替代方法可以执行我想要的操作?我想使用各种PixelProcess*
和*_op
方法并有效地混合它们。
答案 0 :(得分:1)
更简单的方法是在函数中传递函子:
struct PixelProcessChannelwise {
template<class Op, typename... Args>
void operator()(Op&& op, float &dest, int process_nchannels, Args... srcs) const {
for (int ch = 0; ch != process_nchannels; ch++) {
std::forward(op)(dest, srcs[ch]...);
}
}
};
struct add1_op {
void operator()(float& dst, float x) const {
dst = x + 1;
}
typedef PixelProcessChannelwise processor;
};
void f() {
float f = 1.0f;
auto pp = PixelProcessChannelwise();
pp(add1_op{}, f, 0, &f);
}