2012-01-21 12 views
1

基本的には、function_Aを任意のパラメータでT_functionに渡して、T_functionがいくつかのコマンドを実行してから渡された関数を呼び出すことができるようにしたいと考えています。C++:1つのパラメータで任意の関数を受け入れるテンプレート?

これは私が思いついたものですこれは私の目標をもっと明確にするかもしれません):

template <typename t_return, typename t_param> 
void foo(t_return (*func)(t_param), t_param p) 
{ 
    //do code 
    func(p); 
} 

foo<void, int>(&someFunc, someInt); 

上記のコードは素晴らしいですが、迷惑なようです。私はまたそれがいかにばかげているか確信していない。もう少し理解を持っている人はどれも改善していますか? 私はこれをオンラインで調べようとしましたが、検索することは困難でした。

答えて

4

関数の型全体をテンプレートパラメータにするだけで済みます。次に、コンパイラは、入力引数を使用してテンプレートパラメータを推論することができます。

template <typename F, typename T> 
void foo (F func, const T& p) 
{ 
    // do code 
    func(p); 
} 

foo(&someFunc, someInt); 

これには、機能オブジェクトをサポートできるという利点もあります。 (これは、標準ライブラリ( "STL")がアルゴリズムに関数を渡すこともサポートしています)。

+0

関数テンプレートを呼び出すときに '&someFunc'の代わりに' someFunc'でも大丈夫です。 – Nawaz

+0

ありがとう!私は、あなたが非関数をF.として使用するのを妨げることに気づいていませんでした。 – Rakosman

+0

実際には、 'Func'が' operator() 'をオーバーロードしている限り、非関数を' func'として渡すことができます。しかしこれはおそらく望ましい動作です。 –

関連する問題