可変長テンプレート引数
こんなことができるようになる
template <class... Types> class tuple;
tuple<> tup0; tuple<int, string> tup1(3, "abc"); tuple<int, string, double> tup2(3, "abc", 3.14);
sizeof...演算子を使用すると型の数を取得できる
template <class... Types> struct count { static const int value = sizeof...(Types); };
Variadic Templatesを使用するクラスはやはり再帰テンプレートを使って処理するようだ
template <int Index, class... Types> struct tuple_impl; template <int Index> struct tuple_impl<Index> {}; template <int Index, class Head, class... Tail> struct tuple_impl<Index, Head, Tail...> : public tuple_impl<Index, Tail...> { typedef tuple_impl<Index, Tail...> inherit_type; Head head_; inherit_type& tail() { return *this; } const inherit_type& tail() const { return *this; } ...... }; template <class... Types> class tuple : public tuple_impl<0, Types...> { typedef tuple_impl<0, Types...> inherit_type; public: tuple() : inherit_type() {} ...... }; template <> class tuple<> {}; template <class T1, class T2> class tuple<T1, T2> : public tuple_impl<0, T1, T2> { ...... template <class U1, class U2> tuple& operator=(const std::pair<U1, U2>& other) { head_ = other.first; head_.tail().head_ = other.second; return *this; } ...... };