Вы можете сделать это в текущем C ++. Вы задаете шаблону «достаточно большое» количество параметров и задаете им значения по умолчанию:
class nothing1 {};
class nothing2 {};
class nothing3 {};
template <class T1 = nothing1, class T2 = nothing2, class T3 = nothing3>
class X : public T1, public T2, public T3 {};
Или вы можете стать более сложным и использовать рекурсию. Сначала вы заранее объявите шаблон:
class nothing {};
template <class T1 = nothing, class T2 = nothing, class T3 = nothing>
class X;
Затем вы настраиваете на случай, когда все параметры по умолчанию:
template <>
class X<nothing, nothing, nothing> {};
Затем вы правильно определяете общий шаблон (который ранее вы только объявили заранее):
template <class T1, class T2, class T3>
class X : public T1, public X<T2, T3>
Обратите внимание, что в базовом классе вы наследуете X, но пропускаете первый параметр. Так что все они скользят по одному месту. В конечном итоге все они будут иметь значения по умолчанию, и специализация начнется, которая ничего не наследует, и тем самым прекратит рекурсию.
Обновление: просто было странное ощущение, что я публиковал что-то подобное раньше, и угадайте, что ...