index tuple idiomについてと、std::integer_sequenceとかについて考える事
現在私はtuplepleという、boost.fusionのC++11版になりたいタプル操作ライブラリを作っている
作り始めた理由はちょっと込み入ったことをしようと思うと必ずタプル操作が必要になったからだ
で、製作途中でindex_tuple_idiomというのを思いついた
厳密に言うと思いついたけど既に世に知られたものであり
しかもC++14ではstd::integer_sequenceとして標準ライブラリに入るという
無知は罪である。悔しい。この失敗を後世に残してはならない
で、
index tuple idiomとはなんぞよや?超ざっくりいうと以下のようなものである
template<size_t ...N> class Seq{};
こいつを
Seq<1,2,3,4/*以下略*/> seq;
こうして
こうじゃ
template<class F,class Array,size_t ...N> void func(F f,const Array&a,Seq<N...>) { f(a[N]...); }
解説
...によってNを展開、a[0],a[1],a[2]…みたいな感じ
タプルだとこんな感じ
f(get<N>(tuple)...);
自力で1,2,3,4...と打ち込んでいくのは大変つらいのでそこは再帰などを用いて生成するクラスを作る
これを用いると一部関数をO(1)で実装できる、再帰が深くならない、などの利点がある
便利か?と聞かれるとメタプロで便利。という感じである
詳しくは
Constexpr 中3女子テクニック
ボレロさんスライドの66ページ当たりとかよんで
これはtuplepleにおいてsequenceとして実装されていた
いた。とはどういうことか、というとやめたのである
tuplepleはタプル操作ライブラリである
で、あるからにタプルを操作するためのメタ関数が入っている
mapやfilterなどだ
しかし、どう頑張ってもふつうのmapやfilterではsequenceは弄れない
mapもfilterも型を保持するクラスを想定して作られた
しかしsequenceが保持するのは型ではない。整数だ
ゆえにプログラムを書いている最中、sequence用のmapとtupleようのmap二つが存在することになった
抽象化に失敗したのである。TMPにも型が存在するのだ
現在はIndexというintegral_constant的なものを作りそれをtupleに突っ込むことで何とかしている
使う際は
f(get<Idx::value>(tuple)...);
のように使う(ただしコンパイルが通れば)
こういった理由からstd::integer_sequenceが若干不安だなーと考えるのである
まあ、sequenceとtupleを変換する方法があれば解決するのだが