Андрей Александреску дал отличный разговор под названием: Шаблоны Variadic являются funadic.
Он представляет следующие 3 разложения, которые являются подрезанными разными:
template <class... Ts> void fun( Ts... vs ) {
gun( A<Ts...>::hun(vs)...);
gun( A<Ts...>::hun(vs...));
gun( A<Ts>::hun(vs)...);
}
Он объясняет:
Вызов 1:
Расширяет все Ts
для обеспечения устойчивости class A
,
Затем вызывает hun(vs)
Затем снова расширяется все параметры при передаче их в gun
Вызов 2:
Расширяет все Ts
и все vs
отдельно
Вызов 3:
Expnads в шаге блокировки, то есть:
Разверните аргумент 1 из Ts
и аргумент 1 vs
Разверните аргумент 2 из Ts
и аргумент 2 vs
Разверните аргумент n из Ts
и аргумент n vs
Другое обсуждение вариационных шаблонов, по-видимому, охватывает простые шаблоны вариационного класса и вариативные функции, такие как typafe printf и т.д. Я не уверен, как эти различные типы расширения влияют на код и где каждый тип будет полезен.
Есть ли у кого-нибудь примеры, демонстрирующие применение каждого типа расширения?