【ModernCpp】新特性之CTAD

2023-10-24 09:43:09 浏览数 (2)

你好,我是雨乐!

最近在阅读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带来的好处(代码间接

0 人点赞