テンプレートクラスで可変数のパラメーターを処理する方法はありますか?
-
03-07-2019 - |
質問
可変数のパラメーターを持つコールバックを処理するために使用するコールバッククラスのセットがあります。現在、さまざまな数の引数を処理するために、約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はをサポートします可変長テンプレート。
他のヒント
Boost Bindを使用してこの問題を回避する方法について?コードに単一の引数を受け入れるか、まったく引数を受け入れないようにし、呼び出しサイトで必要な引数をバインドできます。
最初の選択肢は、boost :: bind、boost :: function、またはstd :: bind / std :: functionまたはc ++ 11ラムダを使用して目標を達成することです。ただし、独自のファンクターをロールする必要がある場合は、ブーストフュージョンを使用して、単一のテンプレート引数を取る「融合ファンクター」を作成します。
これらのライブラリはすべて、プリプロセッサマクロを使用して、さまざまなテンプレートの欠如を回避するために可能なすべてのオプションを列挙します。
所属していません StackOverflow