gpt4 book ai didi

c++ - 代表类型的变量?运行时继承?

转载 作者:行者123 更新时间:2023-11-30 02:08:36 25 4
gpt4 key购买 nike

我问这个问题的原因:我正在使用一个不是我自己设计的大型框架。我需要使用几个与代码无关的“用户信息”类。它们不派生自任何公共(public)基类,而且我无权访问源代码进行重新编译。

这些信息类是这样工作的:有类A、B、C等。这些类各有一个信息类、Ainfo、Binfo等与其相关联。因为用户(即我)需要将不同的信息附加到给定类的给定对象(这意味着我可能有两个派生自 Ainfo 的不同类,我想附加到 A 的对象),并且只有一个信息槽,我想制作一个可以旧其他各种信息对象的信息对象。这样,我就可以将我的信息添加到这个假的信息对象中,它是其他信息对象的容器。

出现问题是因为我想为 Ainfo、Binfo、Cinfo、Dinfo 等执行此操作。所以我想编写一个 mixin 或只是将容器功能添加到任何普通的旧信息类的东西。

问题是信息类 Ainfo、Binfo 等需要不同的构造函数参数。

所以问题:

是否可以将类型的 vector 传递到 mixin 的构造函数中?这样我就可以传入适当的构造函数参数的变量列表?您可以将类型分配给模板参数之外的变量吗?你能用这个变量进行转换吗?

是否可以从特定对象继承?例如,我可以使用正确的构造函数创建一个新的 Ainfo 对象,然后对该特定对象进行混合。这就像装饰器模式的用法,只是我没有通用接口(interface)。 (被装饰的对象是界面)

我是不是必须硬着头皮写 15,000 个(夸张 :) )完全相同的类,但继承自不同的基类并包含不同类型的对象?

总结:

我需要向几个不同的类添加容器功能,同时维护每个类的接口(interface)并利用它们的参数获取构造函数。我不想重复代码。

提前致谢。很抱歉完全屠宰术语。

最佳答案

在我看来你想要的是一个 Boost.Variant .它就像一个 C++ 风格的 union 体。它是强类型的(因此您始终知道实际存储在其中的内容),并且它具有强大的访问机制,可以轻松地将许多不同类型映射到单个操作。

例如,您可以这样做:

typedef boost::variant<Ainfo, Binfo, Cinfo> CommonInfo;

//In a function.
CommonInfo someInfo = Ainfo();

然后您可以编写可用于调用信息对象成员的访问仿函数。

class DoThingInfoVisitor : boost::static_visitor<>
{
void operator()(Ainfo &info) {info.DoThing()}
void operator()(Binfo &info) {info.DoThing2()}
void operator()(Cinfo &info) {info.StepA(); info.StepB();}
};

有了这个对象,如果你想为任何 CommonInfo 类型做任何这个 DoThing 的意思:

CommonInfo someInfo = Ainfo();
boost::apply_visitor( times_two_visitor(), someInfo );

这将调用 Ainfo 版本,因为它恰好存储在 someInfo 中。如果它存储了 Binfo,那么您就可以使用它。您可以为这些访问者构建一套;它们可以返回值、获取参数(尽管您需要将它们存储在仿函数中)以及您可以从文档中学到的各种其他技巧。

关于c++ - 代表类型的变量?运行时继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6429839/

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