2009-07-01 4 views
2

アイテムを表示するための私のクラスのためのポリシーを確立する関数が必要です。例えば:C++の関数に単項述語を渡す

SetDisplayPolicy(BOOLEAN_PRED_T f) 

これはBOOLEAN_PRED_Tは、いくつかのブール述語の種類等に関数ポインタであると想定されます。

typedef bool (*BOOLEAN_PRED_T) (int); 

私は例えば上の興味:渡された述語がTRUEのときに何かを表示しますそれが偽であるときは表示されません。

上記の例は、boolを返してintをとる関数で動作しますが、SetDisplayPolicy引数には非常に汎用的なポインタが必要なので、UnaryPredicateを考えましたが、それは関連性が高くなっています。 STL/C++の関数に単項述語を渡す方法は? unary_function< bool,T >は戻り値としてboolが必要なので動作しませんが、最も一般的なアプローチでは "boolを返す単項関数"だけをユーザーに尋ねます。私のように自分のタイプを導き出すと考え

template<typename T> 
class MyOwnPredicate : public std::unary_function<bool, T>{}; 

はそれは良いアプローチだろうか?

答えて

4

電源を入れSetDisplayPolicy関数テンプレートへ:次に

template<typename Pred> 
void SetDisplayPolicy(Pred &pred) 
{ 
    // Depending on what you want exactly, you may want to set a pointer to pred, 
    // or copy it, etc. You may need to templetize the appropriate field for 
    // this. 
} 

使用するための、実行します。表示コードで

struct MyPredClass 
{ 
    bool operator()(myType a) { /* your code here */ } 
}; 

SetDisplayPolicy(MyPredClass()); 

if(myPred(/* whatever */) 
    Display(); 

もちろん、あなたのファンクタは状態を持つ必要があり、そのコンストラクタにstuffなどをしてもらいたいかもしれません。ポイントは、SetDisplayPolicyはあなたが与えることを気にしません(関数ポインタを含む)。関数呼び出しを呼び出してboolに戻ります。

編集:そして、CSJが言ったように、あなたはSTLの同じことを行いunary_function継承可能性があり、また、あなたの2 typedefargument_typeresult_typeを購入します。

+0

これを2015年以降に読んでいる人には... std :: unary_function <>の代わりに汎用std :: function <>を使う方が良いかもしれません。後者はC++で廃止される17 – plexoos

5

unary_functionは基本クラスとして意図されているため、正しい軌道に乗っています。ただし、最初のパラメータはargument_type、2番目のパラメータはresult_typeであることに注意してください。あなたがする必要があるし、すべての(演算子を実装している)

template<typename T> 
struct MyOwnPredicate : public std::unary_function<T,bool> 
{ 
    bool operator() (T value) 
    { 
     // do something and return a boolean 
    } 
} 
関連する問題