【发布时间】:2017-04-26 10:19:24
【问题描述】:
如何定义具有默认模板参数且不重复代码的模板类的别名?
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)>(不是编译错误)。
【问题讨论】:
-
你的意思是
F<B>别名E<B, C, B>? -
@Quentin Ops!是的。我会编辑它。谢谢。
标签: c++ templates c++14 typedef maintainability