可変引数テンプレートでの型リスト - map

mapはメタ関数を受け取る高階メタ関数で
型リストの全ての型に、パラメータで受け取ったメタ関数を適用します。

template <template <class T> class F, class... Seq>
struct map;

template <template <class T> class F, class... Seq>
struct map<F, tuple<Seq...>> {
    typedef tuple<typename F<Seq>::type...> type;
};
template <class T>
struct add_pointer {
    typedef T* type;
};

map<add_pointer, tuple<int, double, long>>::type
→ tuple<int*, double*, long*>