模板化函数作为参数

时间:2013-04-02 06:55:20

标签: c++ templates

我的代码看起来像

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&lt; output&gt;()或invoke(output)。有没有办法定义调用以使其有效?

(输出和调用都比较复杂 - 这是一个用于询问问题的简化版本。不,涉及在调用invoke时知道int的解决方案没有帮助。)

1 个答案:

答案 0 :(得分:0)

你做不到这样的事情。在调用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