任意,但编译时已知数量的类型的元组

时间:2013-09-25 15:01:48

标签: c++ templates c++11

假设我有一个由另一个整数POD类型参数化的类型:

template< size_t N >
struct MyFoo { /* ... */ };

有了它,它可以有一个元组:

typedef std::tuple< MyFoo< 1 >, MyFoo< 2 >, MyFoo< 3 > > Foo3;

但是现在,我想要一个“Foo< N >”类型,其中Nconstexpr。实现类似Foo< N >的东西的一种方法是:

template< size_t N >
struct Foos;

template<> struct Foos< 1 >{ typedef std::tuple< MyFoo< 1 > > type; };
template<> struct Foos< 2 >{ typedef std::tuple< MyFoo< 1 >, MyFoo< 2 > > type; };
/* continue with this.... */

E.E。为我想要的每个N手动专门化。有更通用的方法吗?

谢谢:)

2 个答案:

答案 0 :(得分:3)

你需要一些机制来构建从1到N的整数序列。其余的很简单:

#include <cstddef>
#include <tuple>

// to generate a sequence of indices:

template<size_t... Ns>
struct indices {
    typedef indices< Ns..., sizeof...( Ns ) > next;
};

template<size_t N>
struct make_indices {
    typedef typename make_indices< N - 1 >::type::next type;
};

template<>
struct make_indices< 0 > {
    typedef indices<> type;
};

// create a sequence and expand it inside a typedef

template<size_t N>
struct MyFoo {};

template< size_t N >
struct Foos {

    template<typename>
    struct Helper;

    template<size_t... Ns>
    struct Helper<indices<Ns...>> {
        typedef std::tuple< MyFoo<Ns>... > type;
    };

    typedef typename
    Helper< typename make_indices<N>::type >::type type;
};

Live demo.

答案 1 :(得分:2)

template<std::size_t N, std::size_t... Is>
struct MakeFoos : MakeFoos<N - 1, N, Is...>
{
};

template<std::size_t... Is>
struct MakeFoos<0, Is...>
{
    using type = std::tuple<MyFoo<Is>...>;
};

template<std::size_t N>
struct Foos
{
    using type = typename MakeFoos<N>::type;
};

让你的元组写Foos<3>::type