避免重复代码:typedef/using 具有默认参数的模板 class (C++14)
avoid duplicated code : typedef/using a template class that has default parameter (C++14)
如何在没有代码重复的情况下定义具有默认模板参数的模板 class 的别名?
C++14 是否在某些方面对其进行了改进?
在实际情况下,确实会导致可维护性问题。 (demo)
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++中,没有优雅的解决方案。
这是最好的解决方法,修改自 Using a typedefed default type for template parameter :-
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
.
如何在没有代码重复的情况下定义具有默认模板参数的模板 class 的别名?
C++14 是否在某些方面对其进行了改进?
在实际情况下,确实会导致可维护性问题。 (demo)
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++中,没有优雅的解决方案。
这是最好的解决方法,修改自 Using a typedefed default type for template parameter :-
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
.