C++语言
变体(any-variant、templated-variant 和 optional-value)有时被统称为“新词汇类型”。
Any-Variant
类型为 std::any
的变量 xVar
可以在不同的时间存储不同类型的值。例如,在赋值 xVar = 1.1F;
后,可以通过 std::any_cast<float>(xVar);
访问这个 float
值。未初始化的 any
变量将处于一个特殊的“无值”状态,这可以通过 xVar.has_value()
来检查。
Templated-Variant
类型为 std::variant<int, float, std::string>
的变量 xVar
可以存储一个值,该值可以是 int
、float
或 std::string
(一次只能存储其中一个选项)。因此,这种模板变体变量是C语言中联合体(union)的现代替代品。在赋值 xVar = 9.9F;
后,你可以知道该变量当前存储的是 float
类型,因为 std::holds_alternative<float>(xVar)
返回 true
,并且 xVar.index()
返回 1(基于 0 的类型选项索引)。可以通过 std::get<float>(xVar)
或 std::get<1>(xVar)
来访问该值。
Optional-Value
类型为 std::optional<int>
的变量类似于指向 int
的指针,因为它的值可能是 std::nullopt
(类似于空指针)。在这种情况下,我们可以语义上理解为该变量“没有有意义的值”。否则,可以通过赋值存储一个 int
,并通过解引用访问该值。