0

私はC ++に少し慣れていないので、私の問題について説明させてください。CSubcriber というクラスがあります。このクラスの主な目的は、いくつかの型といくつかの引数のコールバック関数を実行することです。たとえば、コールバックは次のようになります。

typedef void (*cb1)(void)
typedef int (*cb2)(int, int)
typedef char (*cb3)(int, int, void);

クラス自体は次のとおりです。

template <class CallbackType>

class CSubscriber {
public:
    CSubscriber();
    virtual ~CSubscriber();
    CallbackType (*m_callback_newWay)(void *params);
    void (*m_callback)(void *params);
    int (*m_callback_int)(void *params);
    void *m_cb_params;
    int execute_cb();
    void *m_params;

    CSubscriber(void (*callback)(void *params), void *cb_params);
    CSubscriber(int (*callback)(void *params), void *cb_params);

};

CSubscriber::CSubscriber(void (*callback)(void *params), void *cb_params){
    m_callback = callback;
    m_cb_params = cb_params;
}

CSubscriber::CSubscriber(int (*callback)(void *params), void *cb_params){
    m_callback_int = callback;
    m_cb_params = cb_params;
}

私の主な問題は、コールバックへのすべての変数引数を処理するコンストラクターの書き方です。特定の瞬間にオブジェクトを構築した後、コールバックが発生する場合があります。次に例を示します。

typedef int (*callback)(void *params);
CSubscriber s(callback, params);

また

typedef void (*callback2)(void *params, int arr, char *ptr);
CSubscriber s(callback, params, arr, ptr);

今、呼び出し

s->m_callback()

コンストラクターに渡したすべての引数でコールバックを実行したい。コールバック関数に渡される引数の数が異なるごとに、10 個の異なるコンストラクターを作成することは避けたいと思います。することは可能ですか?

4

1 に答える 1

0

このようなことを試してください。

#include <iostream>

using namespace std;

typedef void (*cb1)(void);
typedef int (*cb2)(int, int);
typedef char (*cb3)(int, int, char);

template <class CallbackType>
class CSubscriber
{
public:
    CSubscriber(): fcn1(0), fcn2(0), fcn3(0) {};
    virtual ~CSubscriber(){};

    CSubscriber(cb1 fcn): fcn1(fcn), fcn2(0), fcn3(0), a(), b() {};
    CSubscriber(cb2 fcn, int p1, int p2): fcn1(0), fcn2(fcn), fcn3(0), a(p1), b(p2)  {};

    int execute_cb() {
        if ( fcn1 != 0 ) {
            (*fcn1)();
        }
        if ( fcn2 != 0 ) {
            (*fcn2)(a,b);
        }
    };

protected:
    cb1  fcn1;
    cb2  fcn2;
    cb3  fcn3;

    int a, b;
};

void fcn1() {
    cout << "in fcn1" << endl;
};

int fcn2(int a, int b) {
    cout << "in fcn2, a " << a << ", b " << b << endl;
};

int main()
{
    CSubscriber<int> cs;
    CSubscriber<int> cs1(&fcn1);
    CSubscriber<int> cs2(&fcn2, 1, 100);

    cs.execute_cb();
    cs1.execute_cb();
    cs2.execute_cb();
 }
于 2013-07-15T16:07:26.797 に答える