C++ 无法在c+中的指针中存储变量+;

C++ 无法在c+中的指针中存储变量+;,c++,pointers,templates,wrapper,variant,C++,Pointers,Templates,Wrapper,Variant,我和我的团友正在做一项学校作业,我们在试图保存价值时遇到了一些困难。 我100%意识到,代码中所做的一些事情不是正常的做法,还有更好的方法,但部分作业是使用课堂上所教的概念 问题: 我有一个火车班,我想分配给一个站台,这样我就知道站台上是否有火车 模板 班车 { 公众: //一些构造函数、getter和其他东西 私人: 标准::字符串注册号; } 因为火车是一个模板,所以有不同的模板参数类,所以可以给它一个类型 结构IC3{}; 结构IC4{}; 为了实例化一列列车,主要按照以下方式进行,正

我和我的团友正在做一项学校作业,我们在试图保存价值时遇到了一些困难。 我100%意识到,代码中所做的一些事情不是正常的做法,还有更好的方法,但部分作业是使用课堂上所教的概念

问题:

我有一个火车班,我想分配给一个站台,这样我就知道站台上是否有火车

模板
班车
{
公众:
//一些构造函数、getter和其他东西
私人:
标准::字符串注册号;
}
因为火车是一个模板,所以有不同的模板参数类,所以可以给它一个类型

结构IC3{}; 结构IC4{}; 为了实例化一列列车,主要按照以下方式进行,正如其预期的使用方式一样

Train tester\u Train(“testing\u Train”);
培训一些其他测试人员培训(“一些其他测试人员培训”);
平台pl;
pl.列车到达(测试人员列车);
pl.列车离开(测试人员列车);
pl.列车到达(某些列车或其他列车);
类平台
{
公众:
使用Trains=std::variant;
模板
无效列车到达(U&t)
{
列车=TrainWrapper{u};
}
无效列车离开()
{
列车号=???;//应设置为“无”
}
私人:
火车;;
}
模板
结构火车包装器
{
T&T;
};
现在来看问题的真正部分。 我有一个Train模板类,它接受一个参数,并将Train转换为不兼容的不同类型。这就产生了一个问题,即如何将这些不同类型的列车送入站台并保存它们。 为了解决不同类型中的不同传递问题,使用了std::variant。这带来了一个新问题,即无法轻松检索数据,这就是为什么使用TrainWrapper,从而将列车存储在公共类型中

我和我的同伙在修改变体(最后问了我们的老师)时到达了
Trains
站台上看到的表情。我们知道(使用局部变量)可以在Trains对象中保存TrainWrapper。然而,我们的问题是,我们希望能够在站台上换车。因此,我们认为指针是前进的方向,但这样做会遇到转换错误,如:
错误C2440'=':无法从“TrainWrapper”转换为“Platform::Trains*”
。我们尝试了一系列不同的指针变化,但总是相同的转换错误

所以,我们或多或少的问题是:我们如何才能在站台上保存列车,以便能够再次移除它?

您可以使用以下方式发出空车信号:

class Platform
{
public:
    using Trains = std::variant<std::monostate,
                                TrainWrapper<Train<Arriva>>,
                                TrainWrapper<Train<IC3>>,
                                TrainWrapper<Train<IC4>>>;

    template<typename U>
    void train_arriving(U& t)
    {
        train_ = TrainWrapper<U>{ u };
    }

    template<typename U>
    void train_leaving(U& )
    {
        train_ = std::monostate{};
    }
private:
    Trains train_;
};
类平台
{
公众:

使用Trains=std::variant是否有任何理由可以避免动态多态性?也就是说,为所有列使用一个基类并派生特定类型的列(
IC3
IC4
,等等)从中?随着火车类数量的增加,每个模板都会有一个新的实例,该实例将在无需任何需要的情况下快速增长二进制文件。如果您有一个表示任何种类火车的基类,并提供可供“平台”使用的接口,那么它看起来会更干净。使用完全不相关的类并使用std::visit可能是一种解决方案,但会带来更大的二进制文件成本。std::visit可能比vtable access慢得多,因为有时gcc会为运行时可见的std::visible生成跳转表。我知道,如果我们使用多态性,这个问题可能不会存在。不幸的是并非本课程的重点(尽管之前的课程已经介绍了很多),但重点是模板以及如何在编译时实现某些事情。因此,这样做的原因只是为了表明对课程中所教授概念的理解。在我们的项目报告中,我们可以写“我们知道这对这个和这个原因都不好”,所以这不是一个好的解决方案。
TrainWrapper
是什么?
u
从何而来?你怎么能有两个具有相同签名的
train\u到达方法?@Eljay
TrainWrapper
只是用来包装我们的
train
对象,以便更容易地使用
std::visit
de>U
应该是我们的论点。我盲目地承认我们不完全确定参数应该是
U
或类似
Train
或其他什么。两辆相同的
Train\U到达
是一种类型。其中一辆应该是
Train\U离开
。这在我的帖子中已经确定。这似乎是喜欢这个解决方案。但是,当我尝试它时,我得到了以下错误,我不太理解:错误C2280'std::variant&std::variant::operator=(const std::variant&)“:尝试引用已删除的function@FrederikAndersen•将TrainWrapper从
T&T;
改为
std::reference_wrapper T;
#include
。或者直接在
std::variant
中使用
std::reference_wrapper
,然后去掉
TrainWrapper
。你的问题是
TrainWrapper
是不可分配的。添加了演示。@Eljay成功了。更改为
std::reference_wrapper
并结合
std::monostate
解决了我们的问题。我们刚刚运行了代码,验证了一切都按预期运行。谢谢@Jarod42和@Eljay