タイプリストに対するmapの実装とC++11のテンプレートメタプログラミング
なんかむらむらする。プログラムを書くっていう日じゃない
のでちょっと自作ライブラリtupleple::type_list::mapについて書きたい
まず何がやりたいか、サンプルを書く
using tuple=std::tuple<void,int,char>; using result=map<std::add_pointer,tuple>::type; static_assert(std::is_same<result,std::tuple<void*,int*,char*>>::value,"F*ck!!");
一行ずつ解説すると
1行目:mapするタプルの定義
2行目:mapの結果。この場合はtupleの全要素にポインタを付け加えてる
3行目:mapの結果はstd::tuple< void*,int*,char*>と等しいか?
ということである。こういう感じにやりたい。実装を示す
template<template<class>class Transform,class Tuple> class map { using seq=std::make_index_sequence<size<Tuple>::value>;//① template<size_t ...N> static auto trans(std::index_sequence<N...>) ->std::tuple<typename Transform<at<N,Tuple>>::type...>;//② public: using type=decltype(trans(seq()));//③ };
①:C++14で入る予定のindex_sequence。詳しい事はindex_tuple_idiomでググってくれ
②:実装のないTransfromの結果をタプルにまとめて返す関数。いろいろ考えた結果テンプレート引数を簡単に取り出す方法はこれだという結論になった。このギミックに名前がついているかは知らない。使用時はdecltypeして使う
③:decltypeして結果を返す
ね、簡単でしょ?
とりあえず実際動くコード(静的処理だから動かないけど)
[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ
なおこのコードはC++14に対応していないコンパイラでは動かない
std::make_index_sequenceがC++14から入るクラスであるためである
VSとかで動かす時はmake_index_sequenceを自作しよう。自分はtuplepleでそうした