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

型リストのI番目の型を取得するメタ関数です

template <int I, typename Arg>
struct at;

template <int I, typename Head, typename... Tail>
struct at<I, tuple<Head, Tail...>> {
    typedef typename at<I - 1, tuple<Tail...>>::type type;
};

template <class Head, typename... Tail>
struct at<0, tuple<Head, Tail...>> {
    typedef Head type;
};
at<0, tuple<int, double, long>>::type
→ int
at<1, tuple<int, double, long>>::type
→ double
at<2, tuple<int, double, long>>::type
→ long

GCC 4.4 20090320だとこういう部分特殊化ができない

template <int I, typename Head, typename... Tail>
struct at<I, Head, Tail...> { // エラー!sorry, not implementation...
    typedef typename at<I - 1, tuple<Tail...>>::type type;
};

コンパイラのバグ(未実装)かな。
まだスナップショット版だし。