如果我将混音定义为......
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有一些可能有用的特质课程,但我希望有一个更简单的解决方案,我忽视了。
答案 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);
}