0

ジャンプ テーブルとして使用できる関数ポインターの配列を C++ で作成しようとしています。関数はすべて次のようにプロトタイプ化されています

void(unsigned char*, int, int)

だからやろうと思った

typedef void (*func)(unsighed char*, int, int);

その後

func tfunc[256];

次に、個々の要素を次のように設定します。

tfunc[0]=func01;

しかし、その後、「関数呼び出しに引数リストがありません。'&myclass::func01' を使用してください」というメッセージが表示されます。

しかし、私が試してみると

tfunc[0]=&myclass::func0;

「エラー C2440: '=' : cannot convert from 'void (__thiscall myclass::* )(unsigned char *,int,int)' to 'myclass::tfunc' 1> There is no context in which this conversion is可能

私は混乱しています。

ヘッダーに MyClass:: を追加して修正したと思います: tyepdef void (MyClass::*func...);

4

3 に答える 3

1

関数の配列に使用し、次を使用してオブジェクトを適切にバインドできます。std::function<void(unsigned char*, int, int)>std::bind()

using namespace std::placeholders;
std::function<void(unsigned char*, int, int)> tfunc[256];
tfunc[0] = std::bind(&myclass::func0, this, _1, _2, _3);

std::function<Signature>オブジェクトへのポインタなど、必要なコンテキストを通過できるため、すべての場合で関数ポインタを使用するよりも使用する方が適切です。本当に関数を呼び出すだけで、オブジェクトが必要ない場合でも、引き続き使用できstd::function<...>、代わりにfunc0メンバーを作成しました。staticその場合でも使用できますstd::bind()が、実際には必要ありません。

struct myclass {
    static void func0(unsigned char*, int, int);
};
// ...
tfunc[0] = std::bind(&myclass::func0, _1, _2, _3);
tfunc[0] = &myclass::func0;

動的ポリモーフィズムのファン向け: 内部的std::function<...>に継承階層があり、具体的な初期化によって、必要に応じて派生クラスがインスタンス化されます。唯一の本当の違いは、階層を作成するのに苦労する必要がないことと、一部の実装では階層をより効率的にするために巧妙なことを行うことです。

于 2013-11-12T00:08:25.263 に答える
0

{static} 関数へのポインターまたはメンバーへのポインターの配列がある場合でも、関数を呼び出すときにパラメーターを渡す必要があります。

(*vector_of_functions[i])(param1, param2, param3);

上記はスタンドアロン機能用です。メンバーメソッドへのポインターを介してメンバーを実行することは、読者への演習として残されています (ヒント: メンバーへの C++ faq ポインターを参照してください)。

于 2013-11-12T00:10:46.637 に答える