gpt4 book ai didi

c++ - 如何确定非多态类型的混合模板的类型兼容性

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:58 27 4
gpt4 key购买 nike

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

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

最佳答案

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

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

关于c++ - 如何确定非多态类型的混合模板的类型兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7278503/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com