练习16.40
下面的函数是否合法?如果不合法,为什么?如果合法,对可以传递的实参类型有什么限制(如果有的话)?返回类型是什么?
template <typename It>
auto fcn3(It beg, It end) -> decltype(*beg + 0){
// 处理序列
return *beg; //返回序列中一个元素的拷贝
}
解答:
这个函数模板定义是合法的,不过对与类型有限制。
这个类型需要支持+运算操作符,其次还能对 + 0进行正确的处理。这里 int, double,float都是可以的。
练习16.41
编写一个新的sum版本,它的返回类型保证足够大,以容纳加法的结果。
解答:
这里sum的老版本在603页有声明。
往深里看这道题可以看做ACM中的大数问题,可以用字符串来进行解决。
这里就不去写的那么复杂了。
简单用函数模板处理了。
#include <iostream>
#include <climits>
using namespace std;
template <typename T1, typename T2>
long double sum(const T1& a, const T2& b){
return a + b;
}
int main(){
int a = INT_MAX;
double b = LONG_MAX;
cout << sum(a, b) <<endl;
}