C 17 中的部分类模板参数推导
C 17 功能“类模板参数推导”(CTAD) 允许编译器自动推导实例化类时的模板参数。这简化了代码并消除了指定显式模板参数的需要。
但是,我们可以部分指定模板参数并让其余部分被推导吗?
尝试的解决方案 1:
实现部分推导的一种尝试涉及创建别名模板,如下所示:
<code class="cpp">template<class T, class U> using Base2 = Base<T, U, double>;</code>
然后使用别名部分指定参数:
<code class="cpp">void func() { Base2 val(1, 2); }</code>
但是,这会导致编译错误,表明使用别名模板需要完整的模板参数列表。
解决方法:
不幸的是,部分推导不直接支持C 17. 但是,有一些解决方法可用:
1.重载辅助函数:
使用不同的指定参数集创建重载函数,并使用最具体的重载进行推导:
<code class="cpp">template<class T, class U> void func(Base<T, U> val) { } template<class T> void func(Base<T, double> val) { } template<> void func(Base<double> val) { }</code>
2.显式参数推导:
使用显式模板参数推导来指定特定参数,同时推导其他参数:
<code class="cpp">Base val(1, static_cast<double>(4.), false);</code>
3.利用可变参数模板:
创建一个接受多个参数并可以推导出模板参数的可变参数模板:
<code class="cpp">template<typename... Args> class Base { public: Base(Args&&... args) { // Custom logic to deduce template arguments from args... } };</code>
结论:
C 17 中不直接支持部分类模板实参推导。但是,通过使用函数重载、显式推导或可变参数模板等解决方法,可以实现类似的效果。
以上是## 我们可以部分推导 C 17 中类模板的模板参数吗?的详细内容。更多信息请关注PHP中文网其他相关文章!