コンテンツにスキップ

yu::tuples::element_type

namespace yu::tuples {
    template <std::size_t Idx, typename T>
    struct element_type;

    template <std::size_t Idx, typename T>
    using element_type_t = element_type<Idx, T>::type;
}

概要

element_typeは,TupleからIdx番目の要素の型を取得する.

効果

  1. yu::tuples::size<T>::valueが有効な式でなければ,メンバ型エイリアスtypeは定義されない.
  2. Idx < yu::tuples::size<T>::valueでなければ,メンバ型エイリアスtypeは定義されない.
  3. std::remove_cvref_t<T>が要素数の判明している配列型ならば,その配列の型をメンバ型エイリアスtypeとして定義する.
  4. std::tuple_element_t<Idx, std::remove_cvref_t<T>>が有効な型であれば,std::tuple_element_t<Idx, std::remove_cvref_t<T>>をメンバ型エイリアスtypeとして定義する.

以上のどれにも当てはまらないとき,メンバ型エイリアスtypeは定義されない.

カスタマイゼーションポイント

4の条件を満たすようにする.std::tuple_elementを特殊化することでカスタマイズできる.

#include <tuple>
#include <type_traits>
#include <yu/tuples/element_type.hpp>

int main() {
    // std::tuple
    {
        using T = std::tuple<int, char, double>;

        static_assert(std::is_same_v<yu::tuples::element_type_t<0, T> , int>);
        // 参照でもよい
        static_assert(std::is_same_v<yu::tuples::element_type_t<0, T&> , int>);
    }

    // 組み込み配列
    {
        using T = double [1];

        static_assert(std::is_same_v<yu::tuples::element_type_t<0, T> , double>);
    }
}

出力