#What is this index tuple idiom用のアレ
#使いかた プロジェクトのリポジトリに投げ込んだりしてincludeする
#リファレンス ##plasma::integral_sequence
###integral_sequence ####宣言
template<class Ty, Ty... Is>struct integral_sequence;
####メンバ
typedef integral_sequence<Ty, Is...> type;
typedef Ty value_type;
####What is index tuple idiom用のクラス。
###plasma::integral_sequence::index_sequence ####宣言
template<std::size_t... Is>using index_sequence = integral_sequence<std::size_t, Is...>;
###make_integral_sequence ####宣言
template<class... Ts>struct make_integral_sequence;
####What is std::integral_constant列からintegral_sequenceを生成する。 #####例
using type = plasma::integral_sequence::make_integral_sequence<
std::integral_constant<int,1>,
std::integral_constant<int,2>,
std::integral_constant<int,3>>;
###make_countup_sequence ####宣言
template<class Ty, Ty C>struct make_countup_sequence;
template<class Ty, Ty C>using make_countup_sequence_t =
typename make_countup_sequence<Ty, C>::type;
####What is 0,...C-1を含むintegral_sequenceを生成する。C==0なら空のintegral_sequenceを生成する。 ####template引数の要件 Cは0以上でなければならない。 ###make_index_countup ####宣言
template<std::size_t C>struct make_index_countup;
template<std::size_t C>using make_index_countup_t =
typename make_index_countup<C>::type;
####What is make_countup_sequenceのstd::size_t版。ただしmake_countup_sequenceのエイリアスではない。
###sequence_foreach ####宣言
template<class Sequence, template<class>class Functor>struct sequence_foreach;
####What is integral_sequenceの各要素をFunctorに作用させたものをintegral_sequenceに代入したものから派生したクラス。 ####template引数の要件 Sequenceはintegral_sequence Functorはtemplate引数にstd::integral_constantを受け取ってvalueをstaticメンバ定数にもつtemplateクラス ####例
template<class>struct add1;
template<std::size_t I>struct add1<std::integral_constant<std::size_t, I>>:
std::integral_constant<std::size_t, I+1>{};
using type = plasma::integral_sequence::sequence_foreach<
plasma::index_sequence<0, 1, 2>,add1>;
##plasma::integral_sequence::helper ###make_class_functor ####宣言
template<class Ty, template<Ty>class Functor>struct make_class_functor;
template<template<std::size_t>class Functor>using make_index_class_functor =
make_class_functor<std::size_t, Functor>;
####What is
引数を受け取るtemplateクラスからstd::integral_constantを受け取るエイリアスを生成する。
実際にはstd::integral_constantでなくてもstaticメンバ定数valueを持てば良い。
####メンバ
template<class T>using functor = Functor<T::value>;
####例
template<std::size_t I>struct add1:std::integral_constant<std::size_t, I+1>{};
using type = plasma::integral_sequence::helper::make_index_class_functor<add1>::functor<
std::integral_constant<std::size_t, 1>>;
using type2 = plasma::integral_sequence::sequence_foreach<
plasma::integral_sequence::index_sequence<0, 1, 2>,
plasma::integral_sequence::helper::make_index_class_functor<add1>::functor>;