2012-03-02 5 views
7

は、私は、次のフリー機能とファンクタ持って想像:this answerによってdiscribedとしてテンプレートパラメータとしての関数/ファンクタ。彼らは保存することができますか?

void myFreeFunction(void) 
{ 
    cout << "Executing free function" << endl; 
} 

struct MyFunctor 
{ 
    void operator()(void) 
    { 
     cout << "Executing functor" << endl; 
    } 
}; 

を、私は別の関数にテンプレート引数としての私の関数またはファンクタを渡すことができます。

template <typename F> 
void doOperation(F f) 
{ 
    f(); 
} 

そして呼び出します。

doOperation(myFreeFunction); 
doOperation(MyFunctor()); 

これまでのところとても良いです。私は、次のような何かしたい場合はどう:この場合

template<typename Callback> 
class MyClass 
{ 
private: 
    Callback mCallback; 

public: 
    MyClass(){} 

    void execute() 
    { 
     mCallback(); 
    } 
}; 

を私はクラスを宣言するときに、関数/ファンクタをspecifingが、後になるまで、それを呼び出していませんよ。これはファンクタのために働く:機能のための

MyClass<MyFunctor> myClass1; 
myClass1.execute(); 

でもない:

MyClass<myFreeFunction> myClass2; 
myClass2.execute(); 

コンパイラは言う:

エラーC2923: 'MyClassの': 'myFreeFunctionは' は有効なテンプレート型引数ではありませんパラメータ 'コールバック'の場合

どれが適切ですか。これを構造化する?

注:私はstd :: functionを認識しており、これを使用する可能性があります。しかし、私はすべての選択肢を見ています。

おかげで、

デビッド

+0

boost :: bind()とboost :: function()を使用すると、探しているものを達成できます。興味があれば、私は例を挙げることができます。 – Lou

+0

ありがとうございますが、最後に述べたように、私はすでにstd :: functionを解決策として認識しています。関数がインライン化されていないため、パフォーマンスのオーバーヘッドがあるようです。 – PolyVox

答えて

7

問題はfreefunctionはタイプが、(この場合はint型の関数ポインタのの要素ではないということである。

あなたが渡す必要があり、この問題を解決するには。建設で、しかし、あなたはまだ正確な型を知っている必要があり、中に機能

myclass<call_back_t> my_class(call_back); 

EDIT:C++ 11でタイプがdecltype(call_back)から得たことができます

しかし、コールバックを得ることは、コンストラクタにそのような

template<typename CallBack> 
myclass{ 
private: 
    CallBack call_back; 
public: 
    myclass(CallBack call_back_) 
    : call_back(call_back_) 
    {} 
}; 

か何かを変更してはいけないため

//this should be in the namespace of the class or a static member of it 
template<FuncType> 
myclass<FuncType> make_class(FuncType func) 
{ 
    return myclass<FuncType>(func); 
} 
//called like 
myclass mc=make_class(&my_callback); 

ジェネレータ関数を作成するには、多くの場合、多くの方が簡単で面倒なことができ

+0

優秀、情報ありがとうございます。私はあなたが提案したようにMyClassを調整しました。私は今できる: – PolyVox

+0

Meh、私はコメントに質問を追加できないようです。基本的に、あなたのソリューションはファンクタと関数の両方で動作します。私がファンクタに持っている小さな構文上の問題がありますが、私はそれを解決できない場合、新しい質問をします。 – PolyVox

+0

@PolyVox投稿を編集するか、ここに投稿してくださいill tr​​yとhelp – 111111

関連する問題