Инициализировать initializer_list из параметров шаблона - PullRequest
0 голосов
/ 28 сентября 2018

Мне нужно настроить большое количество std :: vector в библиотеке поиска.Все имеют структуру:

{N, N, ..., -N, -N}

Я могу сделать это с помощью ряда шаблонных функций:

template<int N>
static constexpr std::initializer_list<int> H2 = {N, -N};
template<int N>
static constexpr std::initializer_list<int> H4 = {N, N, -N -N};
...

, из которых я могу просто сделать:

std::vector<int> v22 = H2<3>    
std::vector<int> v35 = H3<5>
etc.

Но был бы способ включить также числа 2, 4 и т. Д. В качестве параметра шаблона?

1 Ответ

0 голосов
/ 28 сентября 2018

Да, это возможно при использовании std::integer_sequence и специализации переменных шаблонов:

template <typename, int N>
static constexpr std::initializer_list<int> HImpl;

template <int N, int... Is>
static constexpr std::initializer_list<int> HImpl<std::index_sequence<Is...>, N>
    = {(Is < sizeof...(Is) / 2) ? N : -N...};

template <int Count, int N>
static constexpr auto H = HImpl<std::make_index_sequence<Count>, N>;

Использование:

int main()
{
    std::vector<int> v = H<10, 1>;
    for(int x : v) std::cout << x << ' ';
}

Вывод:

1 1 1 1 1 -1 -1 -1 -1 -1 

живой пример на wandbox.org

...