如何确定非多态类型的mixin模板的类型兼容性

How to determine type compatibility for a mixin template of a non-polymorphic type

本文关键字:类型 兼容性 mixin 何确定 多态      更新时间:2023-10-16

如果我有一个mix-in定义为…

template<class T> class Mixin : public T
{
    // mixin methods and members
};

…并声明T是一个非多态类…

Mixin<NonPoly> mixin;

. .然后有一个基类指针指向它。

NonPoly* nonPolyPtr = &mixin;

…我以后怎么能确保nonPolyPtr是指向一个Mixin类型?

dynamic_cast<Mixin*>(nonPolyPtr)

上面的代码不能编译,因为基类是非多态的。

我看到Boost有一些trait类可能有帮助,但我希望有一个更简单的解决方案,我忽略了

我认为你看错了需求。这里不需要进行任何类型转换,但可能需要对代码进行一些重构。如果你有一个类a的关系,它创建了mixin, B使用NonPoly,那么只需传递给B NonPoly指针,并直接在a中使用mixin。应该没有理由放弃a中的类型信息,只是为了再次获得它。如果有更多的类,将它们分为了解mixin的类和了解NonPoly的类,它们的关系是一样的。

如果一开始就是这种情况,mixin设计很可能不是正确的方法。通常,当需要简单的包含时使用mixins。在我上面的A和B的例子中,你可能有一个Mixin类

template <typename T>
class Mixin
{
  T * GetObject()
  { return & t_; }
  // other methods that use t_
private:
  T t_;
};

,然后在需要对对象进行操作时传递该对象。或者更常见的是,如果你只是将T传递给一些第三方库,你根本不需要mixin。遏制甚至可能不是最好的。当你可以通过类型T的公共接口和公共第三方例程来操作它时,维护封装的最佳方法总是编写文件作用域算法。

如果你能解释为什么你认为你需要失去了类型信息,然后恢复,我们可以更清楚地展示如何重组所有权,这样不需要发生,但因为这类型信息从未离开运行时(因为你想把你的问题意味着它不是连载或任何东西),我可以向你保证,有一些设计,类型信息不会丢失。

如果您确定它的类型,只需使用static_cast向下转换。您还需要在强制转换Mixin<NonPoly>*中指定模板参数。

template<class T>
class Mixin : public T
{
    // mixin methods and members
};
class NonPoly {
};
int main() {
  Mixin<NonPoly> mixin;
  NonPoly* nonPolyPtr = &mixin;
  Mixin<NonPoly>* mixinPtr = static_cast<Mixin<NonPoly>*>(nonPolyPtr);
}