std::variant_alternative, std::variant_alternative_t
来自 cppreference.cn
< cpp | 工具库 | 变体(variant)
定义于头文件 <variant> |
||
template <std::size_t I, class T> struct variant_alternative; /* 未定义 */ |
(1) | (C++17 起) |
template <std::size_t I, class... Types> struct variant_alternative<I, variant<Types...>>; |
(2) | (C++17 起) |
template <std::size_t I, class T> class variant_alternative<I, const T>; |
(3) | (C++17 起) |
template <std::size_t I, class T> class variant_alternative<I, volatile T>; |
(3) | (C++17 起) (C++20 中已弃用) |
提供编译时索引访问,以获取可能带cv限定的变体(variant)的备选类型,它将变体的cv限定(如果有)与备选类型的cv限定组合起来。
形式上,
3) 满足 TransformationTrait 要求,其成员 typedef
type
分别命名为 std::add_const_t<std::variant_alternative_t<I,T>>、std::add_volatile_t<std::variant_alternative_t<I,T>> 和 std::add_cv_t<std::variant_alternative_t<I,T>>目录 |
[编辑] 成员类型
成员类型 | 定义 |
类型 | 变体的第 I 个备选类型,其中 I 必须在 [0, sizeof...(Types)) 范围内,否则程序格式错误。 |
[编辑] 辅助模板别名
template <size_t I, class T> using variant_alternative_t = typename variant_alternative<I, T>::type; |
(C++17 起) | |
[编辑] 示例
运行此代码
#include <variant> #include <iostream> using my_variant = std::variant<int, float>; static_assert(std::is_same_v <int, std::variant_alternative_t<0, my_variant>>); static_assert(std::is_same_v <float, std::variant_alternative_t<1, my_variant>>); // cv-qualification on the variant type propagates to the extracted alternative type. static_assert(std::is_same_v <const int, std::variant_alternative_t<0, const my_variant>>); int main() { std::cout << "All static assertions passed.\n"; }
输出
All static assertions passed.
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 2974 | C++17 | 越界索引导致未定义行为 | 导致格式错误 |
[编辑] 参阅
(C++17) |
在编译时获取 `variant` 替代列表的大小 (类模板) (变量模板) |
获取指定元素的类型 (类模板特化) |