基本的 stdvariant 使用
这会创建一个可以存储 int
或 string
的变体(标记的联合)。
std::variant< int, std::string > var;
我们可以在其中存储任何一种类型:
var = "hello"s;
我们可以通过 std::visit
访问内容:
// Prints "hello\n":
visit( [](auto&& e) {
std::cout << e << '\n';
}, var );
通过传入多态 lambda 或类似的函数对象。
如果我们确定我们知道它是什么类型,我们可以得到它:
auto str = std::get<std::string>(var);
但如果我们弄错了,这就会抛出。get_if
:
auto* str = std::get_if<std::string>(&var);
如果你猜错了,就会返回 nullptr
。
变体保证不动态内存分配(除了由其包含的类型分配的动态内存分配)。变量中只有一种类型存储在那里,并且在极少数情况下(在分配时涉及异常而没有安全的退出方式)变量可能变空。
变体允许你安全有效地将多个值类型存储在一个变量中。它们基本上是智能的,类型安全的 union
s。