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) を呼び出します。これが機能するように呼び出しを定義する方法はありますか?

(出力と呼び出しの両方がより複雑です。これは、質問をするための簡略化されたバージョンです。いいえ、invoke を呼び出すときに 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 に答える