我需要将元素存储在连续的容器中,例如std::vector. 问题是容器需要支持插入或两者都支持int和std::string。
这在 C++ 中似乎很难做到,因为它是一种强类型语言。我想做一些类似的事情
std::vector<std::pair<int, std::string>> container;
Run Code Online (Sandbox Code Playgroud)
或者
struct custom_struct {
int val;
std::string;
bool is_val; // true if integer and false if string
};
std::vector<custom_struct> container;
Run Code Online (Sandbox Code Playgroud)
但这似乎都不是一个很好的选择。第一个的问题是,我不知道如何在该对表示整数还是字符串之间切换,因此为什么我想出了第二种方法,尽管第二种方法不是很优雅,因为我必须重复键入检查使用is_val。
我可以在 C++ 中考虑其他方法吗?
这是std::variant为了:
std::vector<std::variant<int, std::string>> container;
Run Code Online (Sandbox Code Playgroud)
基本上,这也是unionC、C++ 的类型安全版本,但std::variant也是类型安全的。正确使用std::variant会迫使您正确实现类型安全,例如,仅当它实际上包含 a 时才container[0]像 a 一样对待(否则您将得到抛出的异常作为对错误的奖励)。执行所有需要完成的操作,以便正确“在 [variant] 表示整数还是字符串之间切换”。std::stringstd::stringstd::variant
如何使用的完整描述和总结std::variant不能仅用一两段文字来解释,因此请参阅 C++ 教科书或参考手册以获取更多信息。std::variant需要 C++17 或更高版本。