如何在c ++ operator()中特化调用模板?

时间:2018-07-16 19:33:23

标签: c++ templates

考虑以下代码:

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方法并有效地混合它们。

1 个答案:

答案 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);
}