2

異なるクラスのメンバー関数ポインターを保持する配列が必要です。配列を定義するにはどうすればよいですか?

コードは次のようになります。

arr[0] = &CMyClass::FuncX;
arr[1] = &CYourClass::FuncY;
arr[2] = &CHerClass::FuncZ;

試してみvoid*ましたが、うまくいきません。

4

4 に答える 4

3

できません; それらはすべて異なる型であり、配列は均一です。

引数が何であるか、または戻り値が何であるかに関係なくthis、クラス型に固有の暗黙があります。クラス メンバー ポインターの型は次のとおりです。

return_value (class_type::*)(parameters);

ご覧のとおり、これらは異なるクラスに属しているため、常に異なるタイプになります。同じクラスだったとしても、配列を作成するためにreturn_valueandparametersは一貫している必要があります。

全体像は?Boost.Functionを使用したBoost.Bindが思い浮かびます。また、仮想関数が問題を解決する場合があります。

于 2010-03-18T03:33:14.377 に答える
1

他の人が指摘したように、さまざまな種類の関数へのポインターを直接格納することはできません。Commandたとえば、Modern C++ Designのテンプレートを見てみると、少なくとも、さまざまな呼び出し可能な「もの」(関数、ファンクター、メンバー関数へのポインターまたはスマート ポインター) を 1 つのものに入れることができます。

それだけでは、おそらく十分ではありません。(明らかに) さまざまな型でインスタンス化されたテンプレートになり、さまざまな型が生成されます。これらの型はすべて同じ構文を使用しますが、すべてが配列になるわけではありません (単一の型が必要です)。

制約によっては (特に、コンパイル時と実行時のインデックス作成)、Boost::tuple を使用してコマンド オブジェクトのコレクションを格納できる場合があります。数値インデックスを使用して個々のアイテムを取得することで、これを配列のように扱うことができます。ただし、通常の配列とは異なります。

  1. 構文は少し醜いです。
  2. 索引付けは、コンパイル時に (コンパイル時の定数を使用して) 行う必要があります。
于 2010-03-18T03:50:12.367 に答える
0

他の人はあなたがこれをすることができない理由を指摘しました。しかし、できたとしても、それで何ができるでしょうか。メンバー関数ポインタを呼び出すには、適切なタイプのオブジェクトを呼び出す必要があります。したがって、各メンバー関数ポインターのタイプを知る必要があります。あなたは一歩下がって、あなたが成し遂げようとしていることが何であるかを理解する必要があります。

于 2010-03-18T13:50:10.827 に答える
0

関数のパラメーターまたは戻り値の型を知らなければ、それらを定義するのは難しいため、このページを見て、その要点を取得したり、関数の宣言を投稿したりしてください。

于 2010-03-18T03:27:23.093 に答える