• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    class template
    <tuple>

    std::tuple_element

    namespace std {
      template <std::size_t I, class T>
      class tuple_element;                        // (1) C++11 宣言のみで定義なし
    
      template <std::size_t I, class T>
      class tuple_element<I, const T>;            // (2) C++11
    
      template <std::size_t I, class T>
      class tuple_element<I, volatile T>;         // (3) C++11
                                                  // C++20で非推奨
    
      template <std::size_t I, class T>
      class tuple_element<I, const volatile T>;   // (4) C++11
                                                  // C++20で非推奨
    
      template <std::size_t I, class... Types>
      class tuple_element<I, tuple<Types...>> {   // (5) C++11
      public:
        using type = TI;
      };
    
      template <std::size_t I, class T>
      using tuple_element_t =
        typename tuple_element<I, T>::type;       // (6) C++14
    }
    

    概要

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

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

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

    非推奨の詳細

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

    #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, "");
    }
    

    出力

    バージョン

    言語

    • C++11

    処理系

    関連項目

    参照