Без поддержки шаблонов с переменными параметрами авторы шаблонов могут предоставлять только обходные пути, которые выглядят как шаблоны с переменными параметрами:
template<class Arg1=nil, class Arg2=nil /* , ... */>
struct foo {};
Здесь количество шаблонных аргументов, которые предоставляет автор, является пределом.
Если они не предоставят такие обходные пути, вы будете вынуждены прибегнуть к явным спискам типов, которые довольно неуклюжи по сравнению:
typedef list<T1, list<T2, list<T3, nil> > > myTypeList;
foo<myTypeList>::bar;
Они не ограничены фиксированным количеством типов, но я не хотел бы использовать их явно.
Со следующим стандартом C ++ это будет решено с помощью настоящих вариационных шаблонов:
template<class... Args> // can take 0..n arguments
struct foo {};