0

コメントに示されているように、次の構造があります。フレームワークで定義されているものとそうでないものがあります。

struct FixedInterface { // from the framework
   virtual ~FixedInterface() {}
}

struct MyAdditionalInterface { // generic, personal/additional interface
};

私のプログラムの次の構造は、上記の 2 つの構造から派生でき、厳密に型指定されたフレームワークに使用/渡されます。

struct MyFirstInterface : MyAdditionalInterface, FixedInterface {
};

struct MySecondInterface : FixedInterface {
};

struct MyThirdInterface : MyAdditionalInterface, FixedInterface {
};

// ...

struct MyNthInterface : FixedInterface {
};

フレームワークにより、次のシグネチャを持つカスタム関数を定義して「注入」できます。この関数は、必要に応じてフレームワークによって呼び出されます。

void MyClass::my_function(const FixedInterface& obj) {
}

上記の関数の本体では、obj がMyAdditionalInterface(つまりMyFirstInterfaceor MyThirdInterface) のインスタンスであるかどうかを知る方法が必要です。これにより、obj をキャストしてMyAdditionalInterface.

どうすればその情報を入手できますか? 階層を変更せず、vtable がない限り、構造を自由に変更できますMyAdditionalInterface(仮想関数やデストラクタはありません。理由は、フレームワークがそれを許可しないためです)。

場合によっては自由に使用できますBoost。C++11 にアクセスできます。

4

1 に答える 1

1

Adynamic_castは機能します。

MyAdditionalInterface obj2 = dynamic_cast<MyAdditionalInterface const&>(obj)

obj例外 is is not aをスローしますMyAdditionalInterface

ただし、 の使用はdynamic_cast、階層を再設計する必要があることを示しています。

考えられる解決策の 1 つ (1)

?MyAdditionalInterfaceの上でのみ使用しているようです。FixedInterface

もしそうなら、

struct MyAdditionalInterface : FixedInterface { ... }

次に、2 つのオーバーロードを定義します。

void MyClass::my_function(const FixedInterface& obj) {
}
void MyClass::my_function(const MyAdditionalInterface& obj) {
}

考えられる解決策の 1 つ (2)

たとえば、次のように定義します。

struct MyConvolutedInterface : MyAdditionalInterface, FixedInterface {
    ...
}

次に、次のようにクラスを再定義します

struct MyFirstInterface : MyConvolutedInterface  {
};

struct MySecondInterface : FixedInterface {
};

struct MyThirdInterface : MyConvolutedInterface  {
};

// ...

struct MyNthInterface : FixedInterface {
};

次に、2 つのオーバーロードを定義します。

void MyClass::my_function(const FixedInterface& obj) {
}
void MyClass::my_function(const MyConvolutedInterface& obj) {
}

ただし、多くの場合、これが最善の解決策であるかどうかについては懐疑的です。

于 2013-03-14T09:40:33.227 に答える