来自整数的可变模板参数
Variadic template parameters from integer
鉴于我有那种类型
template<int ...Is>
struct A {};
我可以 "generate" 类型 A<0, 1, 2, 3, 4, 5,..., d>
只是来自整数 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] 我的实际用例比这复杂 "bit"。我不想重新实现 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, "");
鉴于我有那种类型
template<int ...Is>
struct A {};
我可以 "generate" 类型 A<0, 1, 2, 3, 4, 5,..., d>
只是来自整数 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] 我的实际用例比这复杂 "bit"。我不想重新实现 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, "");