我有以下结构,其中一些在框架中定义,而另一些则未在注释中指出:

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的实例(即MyFirstInterfaceMyThirdInterface),以便可以将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) {
}


但是,我对在许多情况下这是否是最佳解决方案表示怀疑。

10-08 11:40