次のようなテンプレート クラスを考えてみましょう。
template<typename ReturnType, ReturnType Fn()>
class Proxy
{
void run()
{
ReturnType ret = Fn();
// ... do something ...
}
};
// and a functions
int fn1() { return 5; }
float fn2() { return 5; }
これは、次を使用してインスタンス化できます。
Proxy<int, &fn1> p1;
しかし、戻り値の型を明示的に宣言する必要はないようです。私が達成しようとしているのは次のようなものです:
someProxyInstantation<&fn1> p1;
someProxyInstantation<&fn2> p2;
残念ながら、私は C++ を期待していません。これは言語の隠れたコーナーのように思えます (少なくとも私にとっては)。
関数へのポインターからその型を取得できた場合 - std::tr1::result_of<&fn>::type // エラー 1 エラー C2923: 'std::tr1::result_of' : 'fn1 ' は、パラメーター '_Fty' の有効なテンプレート タイプ引数ではありません
パラメータはまったく「タイプ」ではないため、エラーは理にかなっています
C++0x には decltype(&fn1) がありますが、それは何年も先のことです。
C++03 (+ tr1) でこれを行う方法はありますか?
制限: - ファンクターを渡したくありません。f1 と f2 は、戻り値を持つグローバル関数のままにする必要があります (パラメーターに移動することはできません)。