std::tuple_size<std::tuple>_C++中文网

定义于头文件 <tuple>

template< class T >
class tuple_size; /*undefined*/

(1) (C++11 起)

template< class... Types >

class tuple_size< std::tuple<Types...> >

 : public std::integral_constant<std::size_t, sizeof...(Types)> { };

(2) (C++11 起)

定义于头文件 <tuple>

定义于头文件 <array>

(C++17 起)

定义于头文件 <utility>

(C++17 起)

定义于头文件 <ranges>

(C++20 起)

template< class T >

class tuple_size<const T>

 : public std::integral_constant<std::size_t, tuple_size<T>::value> { };

(3) (C++11 起)

template< class T >

class tuple_size< volatile T >

 : public std::integral_constant<std::size_t, tuple_size<T>::value> { };

(4) (C++11 起)

template< class T >

class tuple_size< const volatile T >

 : public std::integral_constant<std::size_t, tuple_size<T>::value> { };

(5) (C++11 起)

提供对 tuple 中元素数量的访问,作为编译时常量表达式。

在通过包含 <tuple> 头文件变得合法以外,模板 (3-5) 在包含头文件 <array> 或 <utility> 时可用。

所有 std::tuple_size 的特化满足 BaseCharacteristic 对于某些 Nstd::integral_constant<std::size_t, N>一元类型特征 (UnaryTypeTrait)

cv-T 模板 (3-5) 是 SFINAE 友好的:若 std::tuple_size<T>::value 在视作不求值运算数时为病式,则 (3-5) 不提供成员 value 。访问检查如同在无关于 tuple_sizeT 的语境进行。仅考虑表达式直接语境的合法性。这允许:

#include <utility>
struct X { int a, b; };
const auto [x, y] = X(); // 结构化绑定声明首先尝试 tuple_size<const X>
                         // 这试图使用 tuple_size<X>::value ,而那是 OK 的
(C++17 起)

辅助变量模板

template< class T >
inline constexpr std::size_t tuple_size_v = tuple_size<T>::value;

(C++17 起)

示例

#include <iostream>
#include <tuple>
 
template <class T>
void test(T t)
{
    int a[std::tuple_size<T>::value]; // 可在编译时
 
    std::cout << std::tuple_size<T>::value << '\n'; // 或在运行时使用
}
 
int main()
{
    test(std::make_tuple(1, 2, 3.14));
}

输出:

参阅