Как программно сгенерировать std :: index_sequence одинаковых значений без необходимости делать рекурсивную реализацию шаблона для каждого элемента - PullRequest
1 голос
/ 18 апреля 2020
#include <utility>

template<std::size_t Value, std::size_t Count, typename T = std::index_sequence<>>
struct index_sequence_of_same_value;

template<std::size_t Value, std::size_t Count, std::size_t... Rest>
struct index_sequence_of_same_value<Value, Count, std::index_sequence<Rest...>>
{
    using type = typename index_sequence_of_same_value<Value, Count - 1, std::index_sequence<Value, Rest...>>::type;
};

template<std::size_t Value, std::size_t... Rest>
struct index_sequence_of_same_value<Value, 0, std::index_sequence<Rest...>>
{
    using type = std::index_sequence<Rest...>;
};

template<std::size_t Value, std::size_t Count, typename T = std::index_sequence<>>
using make_index_sequence_of_same_value= typename index_sequence_of_same_value<Value, Count, T>::type;


int main()
{
    make_index_sequence_of_same_value<4, 6> t; // std::integer_sequence<std::size_t, 4, 4, 4, 4, 4, 4>
}

Это кажется простым при использовании рекурсивного создания шаблона. Но эта реализация очень медленная и также ограничивающая, поскольку она должна рекурсивно создавать экземпляры шаблонов для каждого элемента.

Есть ли другой способ сделать что-то подобное без создания экземпляров шаблонов для числа элементов?

1 Ответ

2 голосов
/ 18 апреля 2020

Примерно так:

template <std::size_t Value, std::size_t... Is>
std::index_sequence<(Is, Value)...> make_sequence_helper(
    std::index_sequence<Is...>);  // no definition

template<std::size_t Value, std::size_t Count>
using make_index_sequence_of_same_value =
    decltype(make_sequence_helper<Value>(std::make_index_sequence<Count>()));

Демо

...