模板化函数作为参数

Templated function as parameter

本文关键字:参数 函数      更新时间:2023-10-16

我的代码看起来像

template<typename C>
void invoke() {
  if (thing_known_at_runtime) {
    C::template run<int>(4);
  } else {
    C::template run<char>('a');
  }
}
struct output {
  template<typename T>
  static void run(T x) {
    cout << x;
  }
};
invoke<output>();

它成功了。

但是我不喜欢输出的重量级定义。我希望能写:

template<typename T>
void output(T x) {
  cout << x;
}

然后调用invoke()或invoke(output)。是否有一种方法来定义调用,使其工作?

(输出和调用都更复杂——这是一个简化的版本,用于询问问题。不,当我调用invoke时需要知道int的解决方案是没有帮助的。

你不能这样做。在呼叫invoke之前,你应该知道你想做什么。这样就可以了

void invoke(const std::function<void()>& func)
{
   func();
}
template<typename T>
void output (const T& val)
{
   std::cout << val << std::endl;
}
if (rand() % 2)
{
   invoke(std::bind<void(&)(const int&)>(&output, globals::value_calculated));
}
else
{
   invoke(std::bind<void(&)(const char&)>(&output, globals::value));
}

关于lws的完整示例:http://liveworkspace.org/code/1uLIr4$0