C++0x - Variadic Templates

可変長テンプレート引数


こんなことができるようになる

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;
    }

    ......
};

C++0x言語拡張まとめ