4

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

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

有了它,就有可能拥有它们的元组:

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

但是现在,我想要一个类型“ Foo< N >”,其中N一个constexpr. 实现类似于 a 的一种方法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.... */

Ee 为每个 NI 需要手动专门化它。有没有更通用的方法来做到这一点?

谢谢 :)

4

2 回答 2

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

现场演示。

于 2013-09-25T15:10:05.177 回答
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

于 2013-09-25T15:11:04.100 回答