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中文网其他相关文章!