最終更新日時(UTC): 2026年05月20日 09時07分22秒
Akira Takahashi が更新

履歴 編集

class template
<utility>

# std::tuple_element(C++26)

    namespace std {
      template <std::size_t I, class T> class tuple_element;

      template <std::size_t I, class T, T... Values>
      struct tuple_element<I, integer_sequence<T, Values...>> {
        using type = T;
      };

      template <std::size_t I, class T, T... Values>
      struct tuple_element<I, const integer_sequence<T, Values...>> {
        using type = T;
      };
    }

## 概要

`tuple_element`は、タプルとして見なせる型から、`I`番目の要素型を取得するためのクラスである。

`<utility>`ヘッダでは、`integer_sequence`に関する特殊化を提供する。これにより、構造化束縛および`template for`文で`integer_sequence`を使用できる。

## 適格要件

- `I < sizeof...(Values)`であること

## 例

### 基本的な使い方

    #include <utility>
    #include <type_traits>

    int main()
    {
      using Seq = std::integer_sequence<int, 0, 1, 2>;

      static_assert(std::is_same_v<
                      std::tuple_element_t<0, Seq>,
                      int
                    >);
    }

#### 出力

### 構造化束縛で使用する

構造化束縛は`tuple_element`によって各要素の型を決定する。

    #include <iostream>
    #include <utility>

    template <std::size_t Count>
    void run() {
      // tuple_element<I, integer_sequence<size_t, ...>>::type が size_t であるため、
      // 各要素は size_t として束縛される
      constexpr auto [...Index] = std::make_index_sequence<Count>{};

      ((std::cout << Index << ' '), ...);
      std::cout << std::endl;
    }

    int main()
    {
      run<3>();
    }

#### 出力

    0 1 2

### `template for`文で使用する

`template for`文はループ変数の型推論に`tuple_element`を利用する。

    #include <iostream>
    #include <utility>

    int main()
    {
      // tuple_element<I, integer_sequence<int, ...>>::type は int
      template for (auto I : std::integer_sequence<int, 10, 20, 30>{}) {
        std::cout << I << ' ';
      }
      std::cout << std::endl;
    }

#### 出力

    10 20 30

## バージョン

### 言語

- C++26

### 処理系

- Clang: 23 ✅
- GCC: 16.1 ✅
- Visual C++: 2026 Update 2 ❌

## 参照

- P1789R3 Library Support for Expansion Statements