模板函数返回类型的演进

2020-03-30  本文已影响0人  cptn3m0

提纲

  1. c++03: trick 方法
  2. c++11: auto->decltype 组合
  3. c++14: 自动推导模板返回值类型
// cc14_decltype.cc
#include <iostream>
// c++11之前的方案
template <typename U, typename T>
decltype((*((U*)0)) + (*((T*)0))) Add(U u, T t) {
  auto ret = u + t;
  return ret;
}
 
// c++11的 auto_decltype 方案
template <typename U, typename T>
auto Add2(U u, T t) -> decltype(u + t) {
  return u + t;
}

// c++14 的模板可以自动推导出返回类型
template <typename U, typename T>
auto Add3(U u, T t) {
  return u + t;
}

int main(void) {
  std::cout << "add1: " << Add(1.0, 1) << std::endl;
  std::cout << "add2: " << Add2(2.0, 3) << std::endl;
  std::cout << "add3: " << Add2(3.0, 4) << std::endl;

}

c++11

如果使用-std=c++11 编译代码, 会有以下报错, 因为模板自动推导返回值类型是 c++14的标准支持的特性.

cc14_decltype.cc:14:1: error: 'auto' return without trailing return type; deduced return types are a C++14 extension
auto Add3(U u, T t) {
^
cc14_decltype.cc:21:28: error: no matching function for call to 'Add3'
  std::cout << "add3: " << Add3(1.0, 45) << std::endl;
                           ^~~~
2 errors generated.

c++14

这里的代码是清晰的.

上一篇 下一篇

猜你喜欢

热点阅读