Параметры шаблона Variadic из целого числа - PullRequest
10 голосов
/ 24 мая 2019

Учитывая, что у меня есть этот тип

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

Можно ли "сгенерировать" тип 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;

[править] Мой фактический вариант использования:"немного" сложнее, чем это.Я не хочу переопределять std :: integer_sequence, но что-то более сложное.

Ответы [ 2 ]

16 голосов
/ 24 мая 2019

У нас уже есть то, что вы хотите в стандартной библиотеке - 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>
4 голосов
/ 24 мая 2019

Немного другой способ - использовать сигнатуру функции для соответствия типу 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, "");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...