第5章 函数返回类型后置(C++11)
5.1 使用函数返回类型后置声明函数
语法:auto是一个占位符,int才是真正的返回类型
auto foo()->int
{
return 42;
}
返回一个函数指针类型,返回类型后置可能会是一个不错的选择
int bar_impl(int x)
{
return x;
}
typedef int(*bar)(int);
bar foo1()
{
return bar_impl;
}
auto foo2()->int(*)(int)
{
return bar_impl;
}
int main() {
auto func = foo2();
func(58);
}
5.2 推导函数模板返回类型
template<class T1, class T2>
auto sum1(T1 t1, T2 t2)->decltype(t1 + t2)
{
return t1 + t2;
}
int main() {
auto x1 = sum1(4, 2);
}
可以将decltype放在前面,但是不能直接用,需要一些技巧。
(1)调用构造函数,获取返回类型推导
template<class T1, class T2>
decltype(T1() + T2()) sum2(T1 t1, T2 t2)
{
return t1 + t2;
}
存在问题:若无参构造函数不存在,则无法通过编译。(decltype
不实际计算表达式的值,但是会进行语法检查。)
(2)使用static_cast
强转nullptr
template<class T1, class T2>
decltype(*static_cast<T1 *>(nullptr) + *static_cast<T2 *>(nullptr)) sum3(T1 t1, T2 t2)
{
return t1 + t2;
}
由于不实际计算表达式的值,因此运行时不会出现内存错误。
(3)使用std::declval
template<class T1, class T2>
decltype(std::declval<T1>() + std::declval<T2>()) sum4(T1 t1, T2 t2)
{
return t1 + t2;
}
或自己写一个模板函数,无需实现
template<class T>
T&& declval2();
template<class T1, class T2>
decltype(declval2<T1>() + declval2<T2>()) sum5(T1 t1, T2 t2)
{
return t1 + t2;
}
标签:11,return,后置,int,auto,t2,C++,t1,decltype
From: https://www.cnblogs.com/Danieeel959/p/18391966