我有以下结构,其中一些在框架中定义,而另一些则未在注释中指出:
struct FixedInterface { // from the framework
virtual ~FixedInterface() {}
}
struct MyAdditionalInterface { // generic, personal/additional interface
};
我程序中的以下结构可以从上述两个结构派生而来,并被使用/传递给强类型框架
struct MyFirstInterface : MyAdditionalInterface, FixedInterface {
};
struct MySecondInterface : FixedInterface {
};
struct MyThirdInterface : MyAdditionalInterface, FixedInterface {
};
// ...
struct MyNthInterface : FixedInterface {
};
现在,该框架让我定义并“注入”具有以下签名的自定义函数。框架在需要时调用此函数:
void MyClass::my_function(const FixedInterface& obj) {
}
在上述函数的主体中,我需要一种方法来了解obj是否为
MyAdditionalInterface
的实例(即MyFirstInterface
或MyThirdInterface
),以便可以将obj转换为使用MyAdditionalInterface
。我如何获得该信息?只要我不更改层次结构并且
MyAdditionalInterface
没有vtable(没有虚拟函数或析构函数,原因是框架不允许我这样做),我就可以自由修改结构。我可以随意使用
Boost
以防万一。我可以使用C ++ 11。 最佳答案
dynamic_cast
将起作用;
MyAdditionalInterface obj2 = dynamic_cast<MyAdditionalInterface const&>(obj)
如果
obj
不是MyAdditionalInterface
,则会引发异常。但是,使用
dynamic_cast
表示您应该重新设计层次结构。一种可能的解决方案(1)
看来您只在
MyAdditionalInterface
顶部使用FixedInterface
吗?如果是这样的话,
struct MyAdditionalInterface : FixedInterface { ... }
然后,定义2个重载。
void MyClass::my_function(const FixedInterface& obj) {
}
void MyClass::my_function(const MyAdditionalInterface& obj) {
}
一种可能的解决方案(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) {
}
但是,我对在许多情况下这是否是最佳解决方案表示怀疑。