std:: tuple_element
|
定义于头文件
<tuple>
|
||
|
定义于头文件
<array>
|
||
|
定义于头文件
<utility>
|
||
|
定义于头文件
<ranges>
|
(C++20 起)
|
|
|
定义于头文件
<complex>
|
(C++26 起)
|
|
|
template
<
std::
size_t
I,
class
T
>
struct tuple_element ; // 未定义 |
(1) | (C++11 起) |
|
template
<
std::
size_t
I,
class
T
>
struct
tuple_element
<
I,
const
T
>
{
|
(2) | (C++11 起) |
|
template
<
std::
size_t
I,
class
T
>
struct
tuple_element
<
I,
volatile
T
>
{
|
(3) |
(C++11 起)
(C++20 中弃用) |
|
template
<
std::
size_t
I,
class
T
>
struct
tuple_element
<
I,
const
volatile
T
>
{
|
(4) |
(C++11 起)
(C++20 中弃用) |
提供对 类元组 类型元素类型的编译时索引访问。
|
|
(C++17 起) |
目录 |
特化
标准库为以下标准库类型提供了特化版本:
|
(C++11)
|
获取指定元素的类型
(类模板特化) |
|
(C++11)
|
获取
pair
元素的类型
(类模板特化) |
|
(C++11)
|
获取
array
元素的类型
(类模板特化) |
|
获取
std::ranges::subrange
的迭代器或哨兵类型
(类模板特化) |
|
|
获取
std::complex
的底层实数和虚数类型
(类模板特化) |
用户可以为程序定义类型特化
std::tuple_element
,使其成为类元组类型。
在正常情况下,当
get
函数返回引用成员或子对象引用时,仅需针对cv非限定类型的特化进行定制。
成员类型
| 成员类型 | 定义 |
| type |
对于标准特化,表示
元组类
类型
T
的第
I
个元素的类型,其中
I
在区间
[
0
,
std::
tuple_size
<
T
>
::
value
)
内
|
辅助类型
|
定义于头文件
<tuple>
|
||
|
template
<
std::
size_t
I,
class
T
>
using tuple_element_t = typename tuple_element < I, T > :: type ; |
(C++14 起) | |
注释
| 特性测试 宏 | 值 | 标准 | 功能 |
|---|---|---|---|
__cpp_lib_tuple_element_t
|
201402L
|
(C++14) |
std::tuple_element_t
|
示例
#include <array> #include <cstddef> #include <iostream> #include <ranges> #include <tuple> #include <type_traits> #include <utility> template<typename T1, typename T2, typename T3> struct Triple { T1 t1; T2 t2; T3 t3; }; // 为程序定义类型 Triple 特化 std::tuple_element: template<std::size_t I, typename T1, typename T2, typename T3> struct std::tuple_element<I, Triple<T1, T2, T3>> { static_assert(false, "Invalid index"); }; template<typename T1, typename T2, typename T3> struct std::tuple_element<0, Triple<T1, T2, T3>> { using type = T1; }; template<typename T1, typename T2, typename T3> struct std::tuple_element<1, Triple<T1, T2, T3>> { using type = T2; }; template<typename T1, typename T2, typename T3> struct std::tuple_element<2, Triple<T1, T2, T3>> { using type = T3; }; template<typename... Args> struct TripleTypes { static_assert(3 == sizeof...(Args), "Expected exactly 3 type names"); template<std::size_t N> using type = typename std::tuple_element_t<N, Triple<Args...>>; }; int main() { TripleTypes<char, int, float>::type<1> i{42}; std::cout << i << '\n'; using Tri = Triple<int, char, short>; //< 程序定义类型 static_assert(std::is_same_v<std::tuple_element_t<0, Tri>, int> && std::is_same_v<std::tuple_element_t<1, Tri>, char> && std::is_same_v<std::tuple_element_t<2, Tri>, short>); using Tuple = std::tuple<int, char, short>; static_assert(std::is_same_v<std::tuple_element_t<0, Tuple>, int> && std::is_same_v<std::tuple_element_t<1, Tuple>, char> && std::is_same_v<std::tuple_element_t<2, Tuple>, short>); using Array3 = std::array<int, 3>; static_assert(std::is_same_v<std::tuple_element_t<0, Array3>, int> && std::is_same_v<std::tuple_element_t<1, Array3>, int> && std::is_same_v<std::tuple_element_t<2, Array3>, int>); using Pair = std::pair<Tuple, Tri>; static_assert(std::is_same_v<std::tuple_element_t<0, Pair>, Tuple> && std::is_same_v<std::tuple_element_t<1, Pair>, Tri>); using Sub = std::ranges::subrange<int*, int*>; static_assert(std::is_same_v<std::tuple_element_t</
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| LWG 2212 | C++11 | 某些头文件中未要求提供cv限定类型的特化版本,导致出现歧义 | 要求提供 |
参见
| 结构化绑定 (C++17) | 将指定名称绑定到初始化器的子对象或元组元素 |
|
(C++11)
|
获取类元组类型的元素数量
(类模板) |
|
(C++11)
|
通过连接任意数量的元组创建
tuple
(函数模板) |