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があるとする.
Tがtupleのモデルとなるのは,以下の条件をすべて満たす場合である.
が有効な式であり,yu::tuples::size<T>TのTupleとしての要素数を表す定数式である.Idxを,0以上未満を動く,yu::tuples::size<T>std::size_tの定数式とする.- それぞれの
Idxに対して,は有効な式である.yu::tuples::get<Idx>(t) - それぞれの
Idxに対して,は,yu::tuples::get<Idx>(t)TのTupleとしてのIdx番目の要素を返す. - それぞれの
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]>);
}
出力