无法在 C++ 中的指针中存储变体

Not being able to store a variant in a pointer in c++

我和我的队友正在做一项学校作业,我们在尝试保存值时遇到了一些问题。 我 100% 知道在代码中完成的一些事情不是正常的做法,并且有更好的方法,但部分作业是使用 class.[=17 中教授的概念=]

问题:

我有一列火车class,我想将其分配给一个站台,这样我就知道站台上是否有火车。

template<typename T>
class Train
{
public:
    //Some constructors, getters and other stuff 
private:
    std::string reg_nr_;
}

因为 Train 是一个模板,所以有不同的模板参数 class 所以可以给它一个类型

struct IC3{};

struct IC4{};

要实例化一个火车,它是在 main 中按以下方式完成的,这也是它的预期使用方式。

Train<IC3> tester_train("testing_train");
Train<IC4> some_other_tester_train("some_other_tester_train");

Platform pl;
pl.train_arriving(tester_train);
pl.train_leaving(tester_train);
pl.train_arriving(some_other_tester_train);
class Platform
{
public:
    using Trains = std::variant<TrainWrapper<Train<Arriva>>, TrainWrapper<Train<IC3>>, TrainWrapper<Train<IC4>>>;

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

    void train_leaving()
    {
        train_ = ???????; //Should be set to nothing
    }
private:
    Trains train_;
}
template<typename T>
struct TrainWrapper
{
    T& t;
};

现在是问题的实质部分。 我有一个 Train 模板 class,它接受一个参数并将 Train 转换为不兼容的不同类型。这就提出了一个问题,即能否将这些不同的列车类型传递到平台中并保存它们。 为了解决不同类型的不同传递问题,使用了 std::variant。这带来了一个新的问题,即无法轻松检索数据,这就是使用 TrainWrapper 的原因,这样 Train 就可以以通用类型存储。

我和我的队友修改了变体(并最终询问了我们的老师),最终得出了在平台上看到的 Trains 表达式。我们知道一个事实(使用局部变量)我们能够将 TrainWrapper 保存在 Trains 对象中。然而,我们的问题是我们希望能够更改平台上的火车。因此,我们认为指针将是前进的方向,但这样做我们 运行 会陷入转换错误,例如:Error C2440 '=': cannot convert from 'TrainWrapper<Train<Arriva>>' to 'Platform::Trains *'。我们尝试了一堆不同的指针变体,但它总是相同的转换错误。

所以我们的问题或多或少是:我们如何能够在平台上保存火车以便我们能够再次将其删除?

您可以使用 std::monostate 表示空:

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_;
};

Demo