最終更新日時(UTC):
が更新

履歴 編集

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 forinteger_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

処理系

参照