ウェブサイトを長い間使用しており、数え切れないほどの質問に答えてくれました。私は長い間プログラミングをしてきましたが、C++ は初めてです。これが私の最初の質問です。
メンバー関数ポインターを保持する配列が必要です。配列が指す関数は、同じ引数と戻り値の型を持ちますが、異なるクラスのメンバーです。異なるクラスのメンバ関数へのポインタを同じ配列に格納することは可能ですか?
メンバーへのポインター型のポインターを配列に文字通り格納するものを想定すると、答えは次のとおりです。それは異なります。クラス間に階層関係があるかどうかによって異なります。
クラスが完全に無関係である場合は、呼び出しを実行するときにreinterpret_cast
、ポインターをいくつかの共通の型にvoid (SomeArbitraryClass::*)()
のみreinterpret_cast
戻してから、元の型に戻すことができます。これはかなり醜いハックにすぎないため、基本的に「いいえ」の答えです。
(あるいは、Dietmar Kühl が提案したようにstd::function<>
、C++11 で提供されているような型消去手法を使用して、呼び出し可能なオブジェクトを配列に格納することもできます。ただし、そのようなオブジェクトはメンバーへのポインターではなくなります。)
ただし、クラスが同じクラス階層のメンバーである場合、C++ クラス メンバー ポインターは反変であるという事実に依存できます。これは、基本クラスのメンバーへのポインターを派生クラスのメンバーへのポインターに暗黙的に変換できることを意味します。また、暗黙的に逆方向に変換するわけではありませんが、言語は を介してこの変換をサポートしていstatic_cast
ます。したがって、配列要素に型を指定し、配列に入力するときにその型R (CommonBaseClass::*)(Args)
を使用static_cast
する必要があります。この場合、呼び出しを実行するときにこれらのポインターを元の型に変換する必要はありません。言語はすべてを自動的に正しく実行します (ポインターの逆参照の時点で正しい型のオブジェクトを提供すると仮定します)。