2

我的代码看起来像

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<output>() 或invoke(output)。有没有办法定义调用以便它工作?

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

4

1 回答 1

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

于 2013-04-02T07:25:08.567 回答