1

VxWorks アプリケーション用の C++ を書いています。VxWorks は C ベースであるため、関数ポインターを引数として受け取る関数は、C++ のメンバー関数ポインターと互換性がありません。

SomeClassのような関数に渡すことができるようにしたい 30 以上のメンバー関数で数回インスタンス化されるクラス ( ) がありますtaskSpawnこれを実現する2 つの方法を知っていますが、どちらの従来のソリューションも特に好きではありません。

  1. 静的関数を使用して、特定のオブジェクトで C 関数ポインターを呼び出します。

    static void CallFunction1(SomeClass *objectToCallFunction1On);
    static void CallFunction2(SomeClass *objectToCallFunction2On);
    ...
    static void CallFunction30(SomeClass *objectToCallFunction30On);
    
    
    void Function1();
    void Function2();
    ...
    void Function30();
    
  2. 整数型または列挙型を使用して、特定のオブジェクトで呼び出す関数を指定します。

    static void CallFunction(SomeClass *objectToCallFunctionOn, int functionToCall);
    
    void Function1();
    void Function2();
    ...
    void Function30();
    

私は本当に、これらのソリューションの両方が本当に嫌いです。この問題に対するクリーンでシンプルな解決策はありますか?

4

1 に答える 1

1

最初のオプションは、関数ポインターの配列を使用することです。

static void (*functionArray[30])(SomeClass *) = {
    Function1,
    Function2,
    Function3,
    Function4
    //
};

static void CallFunction(SomeClass *objectToCallFunctionOn, int functionToCall) {
   functionArray[functionToCall](objectToCallFunctionOn);
}

もう 1 つのオプションは、型以外のテンプレート パラメーターを使用して同じことを行うことです。しかし、最初のオプションは問題をかなり解決すると思います。

于 2013-04-15T02:34:06.133 に答える