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

Posted

技术标签:

【中文标题】避免重复代码:typedef/使用具有默认参数的模板类 (C++14)【英文标题】:avoid duplicated code : typedef/using a template class that has default parameter (C++14) 【发布时间】: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&lt;B&gt; 会自动扩展为E&lt;B,C,B(default)&gt;(不是编译错误)。

【问题讨论】:

你的意思是F&lt;B&gt;别名E&lt;B, C, B&gt; @Quentin Ops!是的。我会编辑它。谢谢。 【参考方案1】:

您可以使用参数包:

template <class T1, class... T3>
using F = E<T1, C, T3...>;

...直接将零个或一个参数转发给E

【讨论】:

昆汀爵士,一如既往的聪明。 ....我觉得我以前遇到过这种技术。可耻的是我没有考虑到它。 C++ 是一种非常庞大的语言。 哦,别说了,你:p

以上是关于避免重复代码:typedef/使用具有默认参数的模板类 (C++14)的主要内容,如果未能解决你的问题,请参考以下文章

Pyqt将插槽连接到具有默认参数的函数而没有lambda [重复]

Typedef 用法

在结构中使用 typedef 枚举并避免类型混合警告

NUXT.js 和 Axios 运行时如何避免代码重复?

tslint:我想强制参数 typedef 但允许推断类型

重复的 typedef - 在 C 中无效但在 C++ 中有效?