最終更新日時:
が更新

履歴 編集

class template
<tuple>

std::tuple_element(C++11)

namespace std {
  template <size_t I, class T> class tuple_element; // 宣言のみで定義なし

  template <size_t I, class T> class tuple_element<I, const T>;
  template <size_t I, class T> class tuple_element<I, volatile T>;
  template <size_t I, class T> class tuple_element<I, const volatile T>;

  template <size_t I, class... Types>
  class tuple_element<I, tuple<Types...>> {
  public:
    using type = TI;
  };

  template <size_t I, class T>
  using tuple_element_t = typename tuple_element<I, T>::type; // C++14
}

概要

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

tuple_elementの第1テンプレート引数に要素番号、第2引数のタプルの型を指定し、ネスト型であるtype型を取り出すことで要素型を得ることができる。

  • template <size_t I, class T> class tuple_element;

    特殊化のための先行宣言。特殊化されていない型の場合、定義が行われないため要素型を取得しようとする段階でコンパイルエラーとなる。

  • template <size_t I, class T> class tuple_element<I, const T>;

  • template <size_t I, class T> class tuple_element<I, volatile T>;
  • template <size_t I, class T> class tuple_element<I, const volatile T>;

    CV修飾された型からも要素型を取得できるようにするための部分特殊化。

  • template <size_t I, class... Types> class tuple_element<I, tuple<Tuples...>>;

    std::tupleから要素型を取得できるようにするための部分特殊化。

#include <tuple>
#include <type_traits>

int main()
{
  static_assert(std::is_same<
                  std::tuple_element<0, std::tuple<int, char, double>>::type,
                  int
                >::value, "");

  static_assert(std::is_same<
                  std::tuple_element<1, std::tuple<int, char, double>>::type,
                  char
                >::value, "");

  static_assert(std::is_same<
                  std::tuple_element<2, std::tuple<int, char, double>>::type,
                  double
                >::value, "");

  // const修飾
  static_assert(std::is_same<
                  std::tuple_element<0, const std::tuple<int, char, double>>::type,
                  const int
                >::value, "");

  // volatile修飾
  static_assert(std::is_same<
                  std::tuple_element<0, volatile std::tuple<int, char, double>>::type,
                  volatile int
                >::value, "");

  // const, volatile修飾
  static_assert(std::is_same<
                  std::tuple_element<0, const volatile std::tuple<int, char, double>>::type,
                  const volatile int
                >::value, "");
}

出力

バージョン

言語

  • C++11

処理系

参照