最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<tuple>

# std::tuple_size(C++11)

    namespace std {
      template <class T>
      class tuple_size;                   // (1) C++11 宣言のみで定義なし

      template <class T>
      class tuple_size<const T>;          // (2) C++11

      template <class T>
      class tuple_size<volatile T>;       // (3) C++11
                                          // C++20で非推奨

      template <class T>
      class tuple_size<const volatile T>; // (4) C++11
                                          // C++20で非推奨

      template <class... Types>
      class tuple_size<tuple<Types...>>
        : public integral_constant<size_t, sizeof...(Types)> {}; // (5) C++11

      template <class T>
      inline constexpr size_t tuple_size_v =
        tuple_size<T>::value;                                    // (6) C++17
    }

## 概要

`tuple_size`は、タプルとして見なせる型の要素数を取得するためのクラスである。

要素数は、`integral_constant`の機能を利用してコンパイル時の定数値として取得できる。

- (1) : 特殊化のための先行宣言。特殊化されていない型の場合、定義が行われないため要素数を取得しようとする段階でコンパイルエラーとなる
- (2) : `const`修飾された型からも要素数を取得できるようにするための部分特殊化
- (3) : `volatile`修飾された型からも要素数を取得できるようにするための部分特殊化
- (4) : `const volatile`修飾された型からも要素数を取得できるようにするための部分特殊化
- (5) : `std::tuple`の要素数を取得できるようにするための部分特殊化
- (6) : 変数テンプレート版

型`T`がタプルと見なせない型であった場合、

- C++11 : 仕様で明確に規定されてはいないが、直接的にコンパイルエラーとなる
- C++17 : メンバ`value`が定義されない (SFINAEと組み合わせて扱える)

## 非推奨の詳細

- (3), (4) : これらの部分特殊化は、型の`volatile`修飾を部分的に非推奨にすることにともなって、非推奨化される

## 例

    #include <tuple>

    int main()
    {
      static_assert(std::tuple_size<      std::tuple<int, int, int>>::value == 3, "");
      static_assert(std::tuple_size<const std::tuple<int, int, int>>::value == 3, "");
    }

### 出力

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.6.1 ✅
- ICC: ??
- Visual C++: ??

## 関連項目

- C++20 ほとんどの`volatile`を非推奨化

## 参照

- LWG Issue 2770. `tuple_size<const T>` specialization is not SFINAE compatible and breaks decomposition declarations
  - C++17で構造化束縛機能が導入されたことに合わせて、`tuple_size`がSFINAEと組み合わせて使用できるようになった
- P0006R0 Adopt Type Traits Variable Templates from Library Fundamentals TS for C++17
- P1831R1 Deprecating `volatile`: library