テンプレートクラスで可変数のパラメーターを処理する方法はありますか?

StackOverflow https://stackoverflow.com/questions/154780

質問

可変数のパラメーターを持つコールバックを処理するために使用するコールバッククラスのセットがあります。現在、さまざまな数の引数を処理するために、約6つの異なるインスタンスがあります。可変数の引数を処理できるよりも1つのインスタンスを作成する方法はありますか?最終的には、各パラメーターをPOD型、クラスポインター、または構造体ポインターにしたいと思います。アイデアはありますか?

template <class T>
class kGUICallBackPtr
{
public:
    kGUICallBackPtr() {m_obj=0;m_func=0;}
    void Set(void *o,void (*f)(void *,T *));
    inline void Call(T *i) {if(m_func) m_func(m_obj,i);}
    inline bool IsValid(void) {return (m_func!=0);}
private:
    void *m_obj;
    void (*m_func)(void *,T *);
};


template <class T,class U>
class kGUICallBackPtrPtr
{
public:
    kGUICallBackPtrPtr() {m_obj=0;m_func=0;}
    void Set(void *o,void (*f)(void *,T *,U *));
    inline void Call(T *i, U *j) {if(m_func) m_func(m_obj,i,j);}
    inline bool IsValid(void) {return (m_func!=0);}
private:
    void *m_obj;
    void (*m_func)(void *,T *,U *j);
};
役に立ちましたか?

解決

まだ言語自体ではありませんが、C ++ 0xはをサポートします可変長テンプレート

他のヒント

C ++ 0x variatdicテンプレートは最善の策ですが、使用するまでにはしばらく時間がかかります。

今日、型のシーケンスが必要な場合は、MPLの型のベクトル、および他の型シーケンス型。これは Boost ライブラリの一部です。単一のタイプではなく、タイプのシーケンスであるテンプレート引数を提供できます。

Boost Bindを使用してこの問題を回避する方法について?コードに単一の引数を受け入れるか、まったく引数を受け入れないようにし、呼び出しサイトで必要な引数をバインドできます。

最初の選択肢は、boost :: bind、boost :: function、またはstd :: bind / std :: functionまたはc ++ 11ラムダを使用して目標を達成することです。ただし、独自のファンクターをロールする必要がある場合は、ブーストフュージョンを使用して、単一のテンプレート引数を取る「融合ファンクター」を作成します。

http://www.boost.org/doc/libs/1_41_0/libs/fusion/doc/html/fusion/functional/generation/functions/mk_fused.html

これらのライブラリはすべて、プリプロセッサマクロを使用して、さまざまなテンプレートの欠如を回避するために可能なすべてのオプションを列挙します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top