読者です 読者をやめる 読者になる 読者になる

タイプリストに対するmapの実装とC++11のテンプレートメタプログラミング

C++

なんかむらむらする。プログラムを書くっていう日じゃない
のでちょっと自作ライブラリ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でそうした