你好,我是雨乐!
最近在阅读C Templates 2nd,发现有些很有意思的新特性,今天,借助本文,分享给大家。
从一个例子入手
首先,我们看如下例子:
代码语言:javascript复制template <typename T>
class Add{
public:
Add(T first, T second): first_{first}, second_{second} {}
T result()const{return first second;}
private:
T first_;
T second_;
};
这个例子很简单,声明一个模板类Add,接收类型为T的构造函数Add,以及一个返回operator 结果的result()函数。
在c 17之前,如果我们要使用Add类,往往必须像如下这么做:
代码语言:javascript复制int main(){
Add<int> ti(1,2);
return 0;
}
即在实例化对象ot的时候必须指明类型int。
自C 17起引入了新的特性Class Template Argument Deduction,简称为CTAD,即类模板参数推导,那么就可以像如下这样实例化ADD类:
代码语言:javascript复制int main(){
Add ti(1,2); //T 被推导为int
Add td{1.245, 3.1415}; //T 被推导为double
Add tf = {0.24f, 0.34f}; //T 被推到位float
return 0;
}
用例
上面的例子,我们已经体会到了CTAD带来的好处(代码间接