5

可変数のパラメーターを持つコールバックを処理するために使用するコールバッククラスのセットがあります。現在、さまざまな数の引数を処理するために、約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);
};
4

4 に答える 4

5

言語自体にはまだありませんが、C++0x では可変個引数テンプレートがサポートされる予定です。

于 2008-09-30T20:18:38.223 に答える
3

C++0x variatdic templates is your best bet, but it will also be a while before you can use them.

If you need sequences of types today, take a look at MPL's vector of types, as well as other type sequence types. It's part of the Boost library. It allows you to provide a template argument that is a sequence of types, instead of just a single type.

于 2008-10-01T05:55:59.380 に答える
0

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

于 2008-10-01T00:07:48.623 に答える
0

私の最初の選択は、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

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

于 2012-08-02T04:08:24.267 に答える