基本的 stdvariant 使用

这会创建一个可以存储 intstring 的变体(标记的联合)。

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

变体保证不动态内存分配(除了由其包含的类型分配的动态内存分配)。变量中只有一种类型存储在那里,并且在极少数情况下(在分配时涉及异常而没有安全的退出方式)变量可能变空。

变体允许你安全有效地将多个值类型存储在一个变量中。它们基本上是智能的,类型安全的 unions。