Вариативные шаблоны С++
При попытке написания конструктора с вариативным шаблоном возникла проблема с получением значений переменных, переданных с помощью него. Как это можно осуществить? Заранее спасибо.
MyArray(const int size, const Values&... values) {
a = new T[size];
int counter = 0;
while (counter != size) {
a[counter++] = values;
}
}
Ответы (1 шт):
В общем случае аргументы могут иметь разный тип, поэтому обратиться к i-ому аргументу по номеру можно только если этот номер известен во время компиляции: std::get<i>(std::tie(values...)).
Но если уверены, что у аргументов одинаковый тип, то можно запихнуть их в массив: T *array[] = {values...}; (массив указателей - чтобы избежать копирования), и дальше работать с ним как обычно.
Кстати, размер передавать отдельным параметром не нужно. Его можно получить так: sizeof...(Values) (или values, не важно).
Если не хочется засовывать аргументы в массив, то можно еще написать вот так:
template <typename ...Values>
MyArray(const Values&... values) {
a = new T[sizeof...(Values)];
int counter = 0;
((a[counter++] = values), ...);
}
Здесь ((a[counter++] = values), ...); - это так называемое fold-expression. Оно превращается в (values[counter++] = values_1), (values[counter++] = values_2), ... ;.
Или еще один вариант - вообще в одну строчку:
a = new T{values...};