Как назначить аргументы шаблона переменной в std :: array - PullRequest
0 голосов
/ 29 октября 2019

У меня есть std::array, и у меня есть функция шаблона переменной с числом параметров, которое соответствует размеру массива. Мне нужно назначить аргументы для элементов массива. Другими словами, в приведенном ниже коде я хочу, чтобы a получил значения {1, 2, 3} и b, чтобы получить значения {1, 2, 3, 4, 5}

std::array<int, 3> a;
std::array<int, 5> b;

assign_values(a, 1, 2, 3);
assign_values(b, 1, 2, 3, 4, 5);

Вопрос в том, как реализовать шаблон assign_values variadicfunction.

Я ограничен версией C ++ 14.

Обновление: Аргументы могут быть разных типов: assign_values(b, 1, 2u, 3., '4', 5l);

Ответы [ 2 ]

1 голос
/ 29 октября 2019

Я ограничен версией C ++ 14

Старый добрый прием инициализации неиспользуемого массива (до C ++ 17 суррогат свертывания шаблонов) должен работать (такжеC ++ 11)

template <typename T, std::size_t N, typename ... Values>
void assign_values (std::array<T,N> & arr, Values... vals)
 {
    static_assert(N == sizeof...(vals));

    using unused = int[];

    int j = 0;

    (void)unused { 0, (arr[j++] = vals, 0)... };
 }
1 голос
/ 29 октября 2019

Sth, как это:

template<class T, size_t N, class ... Values>
void assign_values(std::array<T,N>& arr, Values... vals) {
    static_assert(N == sizeof...(vals));
    int j = 0;
    for (auto i : std::initializer_list< std::common_type_t<Values...> >{vals...})
        arr[j++] = i;
}

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...