假设我有一个由另一个整数POD类型参数化的类型:
template< size_t N >
struct MyFoo { /* ... */ };
有了它,它可以有一个元组:
typedef std::tuple< MyFoo< 1 >, MyFoo< 2 >, MyFoo< 3 > > Foo3;
但是现在,我想要一个“Foo< N >
”类型,其中N
是constexpr
。实现类似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手动专门化。有更通用的方法吗?
谢谢:)
答案 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;
};
答案 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
。