これはすごい
mpl0x - Faith and Brave - C++で遊ぼう
カリー化っぽいこと出来そう, とか考えていたら別の方向に行ってしまった.
namespace { // anonymous namespace
template <typename ...T, unsigned int N> struct at_impl;
template <typename Head, typename ...T>
struct at_impl<Head, T..., 0> { typedef Head type; };
template <typename Head, typename ...T, unsigned int N>
struct at_impl<Head, T..., N> { typedef typename at_impl<T..., N-1>::type type; };
} // anonymous namespace end
template <typename T> T &type();
template <unsigned int> struct uint_t;
template <unsigned int N> uint_t &uint();
template <typename ...T>
struct type_list_t {
template <typename ...U>
type_list_t<T..., U...> &operator ()(U & ...);
template <unsigned int N>
typename at_impl<T..., N>::type &operator [](uint_t<N> &);
};
extern type_list_t<> type_list;
typedef decltype(type_list(type<char>())(type<int>(), type<long>())(type<float>(), type<double>())) list;
// list: type_list_t<char, int, long, float, double>
typedef decltype(type<list>()[uint<3>()]) type;
// type: float
テンプレートメタプログラミングでオーバーロードされた演算子が使える !! 書いたのはとりあえず
[] だけだけど.type_list<...> は type_<type_list<...>> でやろうとすると面倒なので全部くくらないことにしたら書き直すはめになった. ちゃんとくくらないと色々困りそう.