Как определить псевдоним имени шаблона шаблона, который имеет параметр шаблона по умолчанию без дублирования кода?
В 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)>
автоматически (не ошибка компиляции).
Вы можете использовать пакет параметров:
template <class T1, class... T3>
using F = E<T1, C, T3...>;
… напрямую переслать ноль или один аргумент E
,
Других решений пока нет …