提纲
- c++03: trick 方法
- c++11: auto->decltype 组合
- 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
这里的代码是清晰的.
网友评论