1

私は解決したい特定の問題があります。実行されている情報や例が見つからないため、 。派生クラスのメンバ関数へのポインタですが、派生(仮想)関数ではありません

class ParentObject {}; 

class DerivedObject : public ParentObject 
{ 
    void myFunction(){} 
}; 

class OtherDerivedObject 
{ 
    void myOtherFunction(){} 
}; 

をしてParentObjectへの関数ポインタ:: *をしたいし、それがいずれかの派生クラスから関数を取ることができる持っている: は基本的に、私が持っています。 そうすることを望むための私の理由は、私は(理想的にParentObjectではなく、必要に応じて派生したオブジェクトで個別に行うことができます)別のクラスに

class functionRegistry 
{ 
    std::map<string, *functionPoint> functionMap; 
} 

、各オブジェクトを持っているがfunctionRegistryのインスタンスを持っている、と私はfunctionPointがする必要がありますDerivedObject型またはOtherDerivedObject型のオブジェクトの関数を指すことができるようにします。事前

+3

[古典的なXY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のように見えます。 – YSC

+0

あなたのユースケースは何ですか? –

+0

私は現在、以下の解決策を持っていますが、興味深いことに:コンポーネントが単純なメッセージで互いに話すコンポーネントエンティティベースのアーキテクチャを使用してゲームエンジンを作成しています。メッセージは、FORCE_X + 50のようなもので構成されています。ここでは、メッセージを解析して関数に関連する最初の半分と、引数になる2番目のメッセージを作成します。私が必要とする場所での機能性。異なるコンポーネントは異なるメッセージを受け取り、異なることを行います。 – ChrysmPsy

答えて

2

おかげで必要なのは、正しいタイプで地図を移入するstatic_castです。このよう

using pfunc_type = void (ParentObject::*)() ; 
pfunc_type pfunc1 = static_cast<pfunc_type>(&DerivedObject::myFunction); 

は、標準によって許可されている:

[expr.static.cast/12] - §5.2.9¶12

タイプのDのメンバーへのポインタ」型のprvalue 「cv1 T」は の型の正値に変換され、「Cv2 T型のメンバへのポインタ」 となります。ここで、Bは、Cv2が の場合はDの基本クラス([class.derived]節)資格、または、gr cv1.72よりもeater cv-qualification 「タイプTのBのメンバーへのポインタ」 が「タイプTのDのメンバーへのポインタ」への有効な標準変換が存在しない場合、プログラム 形成されていない。ヌルメンバポインタ値([conv.mem])は、 に、変換先タイプのnullメンバポインタ値に変換されます。クラス に元のメンバーが含まれている場合、または元のメンバーを含む クラスのベースクラスまたは派生クラスの場合、結果のポインタ は元のメンバーを指します。それ以外の場合、動作は未定義です。 [ 注:クラスBに元のメンバーが含まれている必要はありませんが、ポインタ のメンバーへの間接参照を実行するオブジェクトの動的タイプは元のメンバーを含む必要があります。 [expr.mptr.oper]を参照してください。 - エンドノート]

しかし、これは許可されている間、あなたは正しい動的な型を持つオブジェクトのメンバへのポインタを適用することを確認することは非常に慎重でなければなりません。

+0

優秀、これはトリック、感謝をしたようだ! – ChrysmPsy

+0

動作が定義されていないのはなぜですか?コンパイルエラーではないのはなぜですか? – Mikhail

+0

@Mikhail - 基本クラスのメンバ関数と基本クラスオブジェクトへのポインタを受け取る関数を仮定します。コンパイル時にこの制約がどのようにチェックされますか? – StoryTeller

関連する問題