БЕЗСОРОННА КОПІЯ [затверджено джерелом]
Пакети параметрів можуть бути розширені лише в суворо визначеному переліку контекстів, і оператор ,
не є одним із них. Іншими словами, неможливо використовувати розширення пакета, щоб сформувати вираз, що складається з серії підвиразів, розділених оператором ,
.
Основне правило: "Розширення може створити список розділених ,
шаблонів, де ,
є роздільник списку." Оператор ,
не створює список у граматичному сенсі.
Щоб викликати функцію для кожного аргументу, ви можете використовувати рекурсію (яка є основним інструментом у вікні програміста варіадичного шаблону):
#include <utility>
template<typename T>
void foo(T &&t){}
template<typename Arg0, typename Arg1, typename ... Args>
void foo(Arg0 &&arg0, Arg1 &&arg1, Args &&... args){
foo(std::forward<Arg0>(arg0));
foo(std::forward<Arg1>(arg1), std::forward<Args>(args)...);
}
auto main() -> int{
foo(1, 2, 3, "3");
}
КОРИСНА НЕКОпійована інформація
Ще одна річ, яку ви, мабуть, не бачили в цій відповіді, - це використання &&
специфікатора та std::forward
. У C ++ &&
специфікатор може означати одну з двох речей: rvalue-reference або універсальні посилання.
Я не буду вдаватися до rvalue-посилань, але до когось, хто працює з варіативними шаблонами; універсальні посилання - це боже послання.
Ідеальне пересилання
Одним із застосувань std::forward
та універсальних посилань є ідеальне пересилання типів на інші функції.
У вашому прикладі, якщо ми передаємо int&
в foo2
нього автоматично буде знижений int
з - за підписом генерується foo2
функції після шаблону дедукції , і якщо ви хочете , щоб потім переслати цю arg
іншу функцію , яка буде змінювати його по посиланню, ви отримаєте непередбачувані результати ( змінна не буде змінена), оскільки foo2
буде передаватися посилання на тимчасове, створене шляхом передачі int
йому. Щоб обійти це, ми вказуємо функцію пересилання, яка приймає будь-який тип посилання на змінну (rvalue або lvalue). Потім, щоб бути впевненим, що ми передаємо точний тип, переданий у функції пересилання, яку ми використовуємо std::forward
, тоді і тількитоді ми дозволяємо зниження типів; тому що ми зараз у точці, де це найважливіше.
Якщо вам потрібно, читайте більше про універсальні посилання та ідеальну пересилання ; Скотт Мейерс досить чудовий як ресурс.
Args
було порожнім?