コンテンツにスキップ

yu::tuples::tuple

namespace yu::tuples {

template <typename T>
concept tuple = known_tuple<std::remove_cvref_t<T>> || tuple_structured<T>;

}

概要

tupleは,Tupleを定義するコンセプトである.

モデル

decltype((t))T&であるような式tがあるとする. Ttupleのモデルとなるのは,以下の条件をすべて満たす場合である.

  1. yu::tuples::size<T>が有効な式であり,TのTupleとしての要素数を表す定数式である.
  2. Idxを,0以上yu::tuples::size<T>未満を動く,std::size_tの定数式とする.
    1. それぞれのIdxに対して,yu::tuples::get<Idx>(t)は有効な式である.
    2. それぞれのIdxに対して,yu::tuples::get<Idx>(t)は,TのTupleとしてのIdx番目の要素を返す.
    3. それぞれのIdxに対して,yu::tuples::get<Idx>(t)は等しさを保持する.

これらの条件のうち,構文的な検証はすべてyu::tuples::tuple_structuredで行われる.

備考

std::remove_cvref_t<T>に対してyu::tuples::known_tupleが特殊化されていてtrueに評価されるとき,tuple<T>yu::tuples::tuple_structured<T>の評価をスキップする. tupleのモデルでない型Tに対して評価をスキップした場合,プログラムの動作は保障されない.

#include <tuple>
#include <array>
#include <yu/tuples/tuple.hpp>

int main() {
    static_assert(yu::tuples::tuple<std::tuple<int, double, char>>);
    static_assert(yu::tuples::tuple<std::array<double, 3>>);
    // 要素数の判明している組み込み配列型もtupleのモデルである
    static_assert(yu::tuples::tuple<char [2]>);
}

出力