Как определить псевдоним класса шаблона с параметром шаблона по умолчанию без дублирования кода?
Улучшает ли C++14 его каким-то образом?
В реальном случае это действительно вызывает проблему ремонтопригодности. (демонстрация)
class B{};
template<class T1,class T2,class T3=B>class E{}; //<- "class T3=B"
//^ library
//v user
class C{};
template<class T1,class T3=B> using F=E<T1,C,T3>; //<- "class T3=B" is duplicated
int main() {
F<B> f1;
F<B,C> f2;
return 0;
}
Временное решение
В старом C++ нет элегантного решения.
Вот лучший обходной путь, модифицированный из Использование typedefed типа по умолчанию для параметра шаблона :-
class B{};
using E_T3_default=B;
template<class T1,class T2,class T3=E_T3_default>class E{}; //<-
//^ library
//v user
class C{};
template<class T1,class T3=E_T3_default> using F=E<T1,C,T3>; //<-
Моя мечта
Я надеюсь на что-то вроде: -
template<class T1,class T3> using F=E<T1,C,T3>;
и F<B>
будет автоматически расширен до E<B,C,B(default)>
(не ошибка компиляции).