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

时间:2011-09-02 01:50:51

标签: c++ mixins dynamic-cast

如果我将混音定义为......

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有一些可能有用的特质课程,但我希望有一个更简单的解决方案,我忽视了。

2 个答案:

答案 0 :(得分:2)

我认为你正在考虑错误的要求。您不需要在此处进行任何转换,但您可能需要对代码进行一些重组。如果你有一个类A的关系,它创建mixin和B使用NonPoly,那么只需传递B NonPoly指针并直接在A中使用mixin。应该没有理由放弃A中的类型信息只是为了尝试再回来。如果有更多的课程,请将他们分成知道mixin的人和知道NonPoly的人,这是相同的关系。

如果首先是这种情况,很可能混合设计不是正确的方法。通常,在需要简单密封时使用mixins。在我上面的A和B的例子中,你可能有一个Mixin类

template <typename T>
class Mixin
{
  T * GetObject()
  { return & t_; }

  // other methods that use t_
private:
  T t_;
};

然后只需在需要操作时传递对象。或者甚至更常见的是,如果您只是将T传递给某些第三方库,则根本不需要混合。遏制甚至可能不是最好的。保持封装的最佳方法是在通过公共接口和公共第三方例程操作类型T时编写文件范围算法。

如果你能解释为什么你认为你需要丢失类型信息然后恢复,我们可能会更清楚地显示你如何重组所有权以便不需要发生,但是因为这种类型的信息永远不会离开运行时(因为你正在寻找演员 - 你的问题暗示它没有被序列化或任何东西),我可以向你保证,有一些设计,其中首先不会丢失类型信息。

答案 1 :(得分:-1)

如果您确定其类型,请使用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);
}