1

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

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 有一些可能有帮助的特征类,但我希望有一个更简单的解决方案我忽略了。

4

2 回答 2

2

我认为您正在查看错误的要求。您不需要在这里进行任何转换,但您可能需要对代码进行一些重组。如果您有创建 mixin 的类 A 和使用 NonPoly 的 B 的关系,那么只需将 NonPoly 指针传递给 B 并直接在 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 传递给某个 3rd 方库,则根本不需要 mixin。遏制甚至可能不是最好的。维护封装的最佳方法始终是编写文件范围算法,当您可以通过其公共接口和公共 3rd 方例程操作类型 T 时。

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

于 2011-09-02T03:55:22.070 回答
-1

如果您确定它的类型,请使用static_cast向下转换。您还需要在 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);
}
于 2011-09-02T03:03:22.603 回答