首页 >后端开发 >C++ >## C 17 能否在类模板参数推导 (CTAD) 中部分推导模板参数?

## C 17 能否在类模板参数推导 (CTAD) 中部分推导模板参数?

Susan Sarandon
Susan Sarandon原创
2024-10-25 07:23:02272浏览

## Can C  17 Partially Deduce Template Arguments in Class Template Argument Deduction (CTAD)?

C 17 中的部分模板参数推导

C 17 中引入了类模板参数推导 (CTAD),允许编译器自动推导基于函数参数类型的模板参数。但是,CTAD 目前要求推导或显式指定所有模板参数。是否可以部分指定模板参数并让剩余的参数被推导?

考虑以下示例:

<code class="cpp">template<class T, class U, class V>
struct Base {
  constexpr Base(T, U) {}
  constexpr Base(T, U, V) {}
  constexpr Base(V) {}
};

void func() {
  constexpr Base val(1, 4.0, false);
}</code>

使用 CTAD,编译器将正确推导 val 的类型为 Base< ;int、double、bool>。但是,如果我们想要部分指定模板参数,如下例所示,该怎么办?

<code class="cpp"> constexpr Base<T = bool> val1(1, 4.0); // U & V deduced -> Base<int, double, bool>
constexpr  Base<T = bool, T = int> val2(5.0); // V deduced -> Base<bool, int, double></code>

不幸的是,此代码将无法编译,因为编译器要求推导或显式指定所有模板参数.

解决方法

由于不直接支持部分 CTAD,因此我们可以使用一些解决方法:

  • 为以下对象创建别名模板具体的参数组合,如下例所示:
<code class="cpp">using NewBase2 = Base<double, int>;

void func() {
  constexpr NewBase2 val(1, 2);
}</code>
  • 使用模板元编程技术根据部分指定的参数有条件地选择适当的模板。

结论

C 17 中不直接支持部分 CTAD,但有一些解决方法可以实现类似的功能。即将推出的 C 20 标准预计将包括对具有别名模板的 CTAD 的支持,但目前不包括对部分 CTAD 或具有继承构造函数的 CTAD 的支持。

以上是## C 17 能否在类模板参数推导 (CTAD) 中部分推导模板参数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn