首页 > 后端开发 > C++ > ## 我们可以部分推导 C 17 中类模板的模板参数吗?

## 我们可以部分推导 C 17 中类模板的模板参数吗?

Mary-Kate Olsen
发布: 2024-10-25 07:36:29
原创
755 人浏览过

## Can We Partially Deduce Template Arguments for Class Templates in C  17?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板