来自整数的可变参数模板参数

时间:2019-05-24 07:46:46

标签: c++ variadic-templates

鉴于我有这种类型

template<int ...Is>
struct A {};

我可以仅从整数d“生成”类型A<0, 1, 2, 3, 4, 5,..., d>吗?

我想到了类似的东西

template<int d>
struct B : A<std::index_sequence<d>...> {}

但是它不起作用。

其他选项是手动进行专业化:

template<int d>
struct B;

template<>
struct B<0>: A<> {};

template<>
struct B<1>: A<0> {};

template<>
struct B<2>: A<0, 1> {};

template<>
struct B<3>: A<0, 1, 2> {};

但显然我无法写B<3000> b;

[edit]我的实际用例比这更复杂。我不想重新实现std :: integer_sequence,但是要更复杂一些。

2 个答案:

答案 0 :(得分:15)

我们已经在标准库中提供了您想要的-std::make_integer_sequence。如果要使用自己的类型A<...>,可以执行以下操作:

template<int... Is>
struct A {};

template<class>
struct make_A_impl;

template<int... Is>
struct make_A_impl<std::integer_sequence<int, Is...>> {
    using Type = A<Is...>;
};

template<int size>
using make_A = typename make_A_impl<std::make_integer_sequence<int, size>>::Type;

然后A<0, ..., 2999>

make_A<3000>

答案 1 :(得分:4)

另一种方法-使用函数签名来匹配A<...>类型:

#include <type_traits>

template<int ...Is>
struct A {};

namespace details
{
template <int ...Is>
auto GenrateAHelper(std::integer_sequence<int, Is...>) -> A<Is...>;
}

template<int I> 
using GenerateA = decltype(details::GenrateAHelper(std::make_integer_sequence<int, I>()));

static_assert(std::is_same<GenerateA<3>, A<0, 1, 2>>::value, "");