繁体   English   中英

整数的变量模板参数

[英]Variadic template parameters from integer

鉴于我有这种类型

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, "");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM