БЕЗСОРОННА КОПІЯ [затверджено джерелом]
Пакети параметрів можуть бути розширені лише в суворо визначеному переліку контекстів, і оператор ,не є одним із них. Іншими словами, неможливо використовувати розширення пакета, щоб сформувати вираз, що складається з серії підвиразів, розділених оператором ,.
Основне правило: "Розширення може створити список розділених ,шаблонів, де ,є роздільник списку." Оператор ,не створює список у граматичному сенсі.
Щоб викликати функцію для кожного аргументу, ви можете використовувати рекурсію (яка є основним інструментом у вікні програміста варіадичного шаблону):
#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було порожнім?