避免重复的代码:使用具有默认参数的模板类(C 14)

avoid duplicated code : typedef/using a template class that has default parameter (C++14)

本文关键字:参数 默认 代码      更新时间:2023-10-16

如何定义具有默认模板参数的模板类的别名名称,而无需代码重复?

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;
}

orararound

在旧的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