首页 > 解决方案 > 为使用 std::variant 进行数据存储的异构容器选择什么实现方式?

问题描述

对于一个简单的类 Rogue 游戏的程序,我需要一个容器来存储每个房间的内容,无论是敌人、战利品、陷阱、传说条目等。由于每个房间中保存的类型集是有限且预先确定的,因此我已经解决std::variant了数据存储。我还需要处理数据的方法,问题就来了。现在由于缺乏经验,我很难选择不会成为长期负担的实现。

客观风格方法:

using myVariant = std::variant<TYpe1, Type2 ... TypeN>;

template <typename V>
class HVector
{
private:
    class HVElem
    {
    private:
        V data;
    public:
        V getData();
    };

    std::vector<HVElem> content;

public:
    void push(V newData);
};

int main()
{
    HVector<myVariant> hVector;
}

功能方法:

using myVariant = std::variant<TYpe1, Type2 ... TypeN>;

template <typename V> void push(std::vector<V> hVector, V newData) 
{
    // something
}

int main()
{
    std::vector hVector<myVariant>;
}

问题:

  1. 这两种方法哪个更好?我有一种强烈的感觉,std::vector<std::variant<>>在这种情况下,简单地使用一些模板函数就足够了。这里甚至需要使用客观的风格吗?
  2. 如何防止程序创建包含除std::variant<>. 有没有办法简单地列出类型别名中的类型以便我可以简单地编写std::vector<std::variant<myTypes>>

标签: c++oopc++17

解决方案


这两种方法哪个更好?

两者都不是,请参见下面的选项 3。

如何防止程序创建包含 std::variant<> 以外的任何内容的容器?

using myVariant = std::variant<TYpe1, Type2 ... TypeN>;
using myVector = std::vector<myVariant>;

推荐阅读