来自整数的variadic模板参数

Variadic template parameters from integer

本文关键字:参数 variadic 整数      更新时间:2023-10-16

给定我有那种类型

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;

[编辑]我的实际用例比这更复杂。我不想重新结束std :: integer_sequence,但更复杂。

我们已经在标准库中拥有您想要的东西-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>

有其他方法 - 使用函数签名与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, "");