最終更新日時: 2026年06月21日 17時39分07秒 (JST)
Raclamusi が更新

履歴 編集

class template
<utility>

# std::integer_sequence(C++14)

    namespace std {
      template <class T, T... I>
      struct integer_sequence {
        using value_type = T;
        static constexpr std::size_t size() noexcept { return sizeof...(I); }
      };
    }

## 概要

`integer_sequence`は、任意の整数型のシーケンスをコンパイル時に表現するクラスである。

このクラスは、`tuple`オブジェクトを展開して、引数パックとして他の関数に転送することを主目的として作られた。

## 適格要件

- `T` は整数型であること。

## タプルインタフェース

名前 | 説明 | 対応バージョン
--- | --- | ---
`tuple_size` | 静的な要素数取得(class template) | C++26
`tuple_element` | 静的な要素の型取得(class template) | C++26

## 非メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`get` | 指定したインデックスの整数値を取得する | C++26

## 備考

- C++17まで : テンプレートパラメータ `T` が整数型でない場合の動作は未定義。
- C++20から : `T` が整数型でない場合、プログラムは不適格となり、コンパイルエラーとなることが要求されるようになった。

## 例

### 基本的な使い方

    #include <iostream>
    #include <utility>

    void g(int a, int b, int c)
    {
      std::cout << a << ", " << b << ", " << c << std::endl;
    }

    template <class T, T... Seq>
    void f(std::integer_sequence<T, Seq...>)
    {
      // 定数のシーケンス{0, 1, 2}を取り出して、関数g()の引数として転送
      g(Seq...);
    }

    int main()
    {
      f(std::integer_sequence<int, 0, 1, 2>());
    }

#### 出力

    0, 1, 2

### 構造化束縛と`template for`文で使用する (C++26)

    #include <iostream>
    #include <utility>

    // 構造化束縛でパックとして取り出す記法はテンプレート内でのみ利用できる
    template <std::size_t Count>
    void run()
    {
      // 構造化束縛で整数シーケンスをパックとして取り出す
      constexpr auto [...Index] = std::make_index_sequence<Count>();
      ((std::cout << Index << ' '), ...);
      std::cout << std::endl;

      // template for文で整数シーケンスを直接イテレートする
      template for (constexpr std::size_t I : std::make_index_sequence<Count>()) {
        std::cout << I << ' ';
      }
      std::cout << std::endl;
    }

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

#### 出力

    0 1 2
    0 1 2

## バージョン

### 言語

- C++14

### 処理系

- Clang: 3.4 ✅
- GCC: 4.9.0 ✅
- ICC: ??
- Visual C++: 2015 ✅

## 参照

- N3658 Compile-time integer sequences
- P1460R1 Mandating the Standard Library: Clause 20 - Utilities library
- P1789R3 Library Support for Expansion Statements
  - C++26で構造化束縛と`template for`文で使用できるよう、`tuple_size` / `tuple_element` / `get`の特殊化を追加