c++ - 为使用 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>;
}
问题:
- 这两种方法哪个更好?我有一种强烈的感觉,
std::vector<std::variant<>>
在这种情况下,简单地使用一些模板函数就足够了。这里甚至需要使用客观的风格吗? - 如何防止程序创建包含除
std::variant<>
. 有没有办法简单地列出类型别名中的类型以便我可以简单地编写std::vector<std::variant<myTypes>>
?
解决方案
这两种方法哪个更好?
两者都不是,请参见下面的选项 3。
如何防止程序创建包含 std::variant<> 以外的任何内容的容器?
using myVariant = std::variant<TYpe1, Type2 ... TypeN>;
using myVector = std::vector<myVariant>;
推荐阅读
- haskell - 为什么调用以 IO() 作为返回值的函数会导致模棱两可的类型错误?
- c - #ifdef 在结构初始化中的使用
- sms - 有没有办法使用 Qpython 发送超过 160 个字符的多部分 SMS 消息?
- laravel - Laravel 护照 Oauth2 “请求令牌”
- symfony - 如何防止不想要的教义在 symfony 4 中持续存在?
- python - 自定义训练 YOLOv3 模型后没有边界框
- go - Testify mock 正在返回该函数尚未被调用的断言
- react-native - createBottomTabNavigator里面如何实现createDrawerNavigator
- qt5 - 对于这种情况是否有解决方案'当我将边缘拖动到一定程度时,中央 QDockWidget 被隐藏。'?
- angular - 需要将变量加载到路由器插座