Namespaces
Variants

std:: tuple_size

From cppreference.net
Utilities library
ヘッダーで定義 <array>
ヘッダーで定義 <tuple>
ヘッダーで定義 <utility>
ヘッダーで定義 <ranges>
(C++20以降)
ヘッダーで定義 <complex>
(C++26以降)
template < class T >
struct tuple_size ; // 未定義
(1) (C++11以降)
template < class T >

struct tuple_size < const T >

: std:: integral_constant < std:: size_t , std :: tuple_size < T > :: value > { } ;
(2) (C++11以降)
template < class T >

struct tuple_size < volatile T >

: std:: integral_constant < std:: size_t , std :: tuple_size < T > :: value > { } ;
(3) (C++11以降)
(C++20で非推奨)
template < class T >

struct tuple_size < const volatile T >

: std:: integral_constant < std:: size_t , std :: tuple_size < T > :: value > { } ;
(4) (C++11以降)
(C++20で非推奨)

タプルライク型の要素数をコンパイル時定数式として提供します。 tuple-like

1) プライマリテンプレートは定義されていません。型をタプルライクにするには、明示的(完全)または部分的な特殊化が必要です。
2-4) cv修飾型に対する特殊化は、デフォルトでは対応するcv非修飾版の value を再利用します。

std::tuple_size はコア言語と相互作用します:タプルライクなケースで 構造化バインディング のサポートを提供できます。

(2-4) はSFINAE-friendlyです: std :: tuple_size < T > :: value が未評価オペランドとして扱われた際にill-formedである場合、これらはメンバー value を提供しません。アクセスチェックは tuple_size および T とは無関係なコンテキストで実行されるかのように行われます。式の直接のコンテキストの有効性のみが考慮されます。これにより以下が可能になります:

#include <utility>
struct X { int a, b; };
const auto [x, y] = X(); // 構造化バインディング宣言は最初に
                         // tuple_size<const X>を試み、次にtuple_size<X>::valueの使用を試み、
                         // その後ソフトエラーが発生し、公開データメンバーにバインドします
(C++17以降)

目次

特殊化

標準ライブラリは、標準ライブラリ型に対して以下の特殊化を提供します:

tuple のサイズを取得する


(クラステンプレートの特殊化)

pair のサイズを取得する
(クラステンプレートの特殊化)
array のサイズを取得する
(クラステンプレートの特殊化)
std::ranges::subrange のサイズを取得する
(クラステンプレートの特殊化)
std::complex のサイズを取得する
(クラステンプレートの特殊化)

std::tuple_size のすべての特殊化は、ある N に対して UnaryTypeTrait を満たし、 基本特性 std:: integral_constant < std:: size_t , N > となります。

ユーザーはプログラム定義型に対して std::tuple_size を特殊化して、それらをタプル様にすることができます。プログラム定義の特殊化は上記の要件を満たさなければなりません。

通常、cv修飾されていない型に対する特殊化のみをカスタマイズする必要があります。

ヘルパー変数テンプレート

ヘッダーで定義 <tuple>
template < class T >
constexpr std:: size_t tuple_size_v = tuple_size < T > :: value ;
(C++17以降)

std:: integral_constant から継承

メンバ定数

value
[static]
標準特殊化の場合、タプル様型 T の要素数
(公開静的メンバ定数)

メンバ関数

operator std::size_t
オブジェクトを std:: size_t に変換し、 value を返す
(公開メンバ関数)
operator()
(C++14)
value を返す
(公開メンバ関数)

メンバ型

定義
value_type std:: size_t
type std:: integral_constant < std:: size_t , value >

#include <array>
#include <cstddef>
#include <ranges>
#include <tuple>
#include <utility>
template<class T, std::size_t Size> struct Arr { T data[Size]; };
// プログラム定義の std::tuple_size 特殊化:
template<class T, std::size_t Size> struct std::tuple_size<Arr<T, Size>>
    : public integral_constant<std::size_t, Size> {};
int main()
{
    using tuple1 = std::tuple<int, char, double>;
    static_assert(3 == std::tuple_size_v<tuple1>); // using テンプレートを使用 (C++17)
    using array3x4 = std::array<std::array<int, 3>, 4>;
    static_assert(4 == std::tuple_size<array3x4>{}); // operator std::size_t を使用
    using pair = std::pair<tuple1, array3x4>;
    static_assert(2 == std::tuple_size<pair>()); // operator() を使用
    using sub = std::ranges::subrange<char*, char*>;
    static_assert(2 == std::tuple_size<sub>::value);
    using Arr5 = Arr<int, 5>;
    static_assert(5 == std::tuple_size_v<Arr5>);
}

欠陥報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 2212 C++11 cv修飾型の特殊化が一部ヘッダーで要求されず、曖昧性が生じていた 要求される

関連項目

Structured binding (C++17) 指定された名前を初期化子の部分オブジェクトまたはタプルの要素にバインドする
タプルライクな型の要素型を取得する
(クラステンプレート)
(C++11)
任意の数のタプルを連結して tuple を作成する
(関数テンプレート)