学习笔记:
在泛型编程中,可能需要通过参数的运算来得到返回值的类型,比如下面这个场景
#include <iostream>
using namespace std;
// R->返回值类型, T->参数1类型, U->参数2类型
template <typename R, typename T, typename U>
R add(T t, U u)
{
return t + u;
}
int main()
{
int x = 520;
double y = 13.14;
// auto z = add<decltype(x + y), int, double>(x, y);
auto z = add<decltype(x + y)>(x, y); // 简化之后的写法
cout << "z: " << z << endl;
return 0;
}
关于返回值,从上面的代码可以推断出和表达式t+u的结果类型是一样的,因此可以通过通过decltype进行推导,关于模板函数的参数t和u
可以通过实参自动推导出来,因此在程序中就也可以不写。虽然通过上述方式问题被解决了,但是解决方案有点过于理想化,因为对于调用者来说,是不知道函数内部执行了什么样的处理动作的。因此如果要想解决这个问题就得直接在 add
函数身上做文章
#include <iostream>
template<typename T, typename U>
auto add(T t, U u) -> decltype(t + u) {
return t + u;
}
int main() {
int x = 520;
double y = 13.14;
auto ret = add(x, y);
std::cout << "ret:" << ret << std::endl;
return 0;
}