gpt4 book ai didi

c++ - 我正在研究使用 std::variant 的异构列表。有没有办法每次使用 std::variant 的自定义类型集对其进行初始化?

转载 作者:行者123 更新时间:2023-12-03 07:00:39 27 4
gpt4 key购买 nike

...或在内部快速更改类型 std::variant在源代码中。
下面是列表本身及其容器元素的头文件中的代码。

// HVector.hh
class HVector: public std::vector<HVElem>
{
public:
HVector();
void push(std::variant<Party, Loot> newData);
void show();
};

//HVElem.hh
class HVElem
{
public:
HVElem( std::variant<Party, Loot> newData );
~HVElem();
std::variant<Party, Loot> getData();
private:
std::variant<Party, Loot> data;
};
我担心当我必须更改 HVector 的类型集时我会手动修改每个 std::variant 的“<>”内的大量代码更改内容。 .
  • 这只是使用 std::variant 的坏主意吗?在这种情况下?
  • 如果是,我应该使用模板还是 std::any ?
  • 有没有办法存储类型并将它们传递给 HVector在初始化期间?
  • 重构工具是解决问题的方法吗?
  • 最佳答案

    1. Is this just a bad idea of using std::variant in this case?

    上下文太少,所以我必须假设您使用的是 std::variant因为 std::variant是你所需要的。
    1. If yes, should I use templates or std::any?
    std::any是为了一些非常不同的东西。 std::variant用于有限的一组类型, std::any适用于任何类型。根据您的实际需要选择一个或另一个,而不是基于更容易的重构等。
    1. Is there a way to store types and pass them into HVector during initialization?

    您可以使用别名:
    using my_variant = std::variant<Party,Loot>;
    如果您愿意,可以制作类模板并提供变体类型作为参数:
    template <typename T>
    class HVector:
    {
    public:
    HVector();
    void push(T newData);
    void show();
    };
    这将更灵活,但并不是真正必要的。
    1. Are refactoring tools a solution to the problem?

    一旦你有了别名 my_variant并且您在整个代码中始终如一地使用它,您只需在一个地方更改它。
    PS:从标准容器公开继承通常不是一个好主意。它可以做得对,但你必须小心。我允许自己在上面的例子中简单地忽略那部分,因为它只与问题有很大关系。
    PPS:情况与 std::variant有点类似于 std::pair .我的意思是通用性是以没有意义的名字为代价的。即使您只在代码中的一个地方使用该变体,您也应该给它一个有意义的名称。阅读您的代码时,我不明白什么是 std::variant<Party,Loot>真的是。使用别名会有所不同,它告诉我有关含义的一些信息。我不知道什么是好名字。 my_variant当然不是一个。

    关于c++ - 我正在研究使用 std::variant 的异构列表。有没有办法每次使用 std::variant 的自定义类型集对其进行初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64118359/

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