《C++ Primer》16.2.2节的问题
描述如下
该节主题:函数模板的显示实参
在某些情况下,不可能推断模板实参的类型。当函数的返回类型必须与形参表中所用的所有类型都不同时,最常出现这一问题。在这种情况下,有必要覆盖模板实参推断机制,并显式指定为模板形参所用的类型或值。
考虑下面的问题。我们希望定义名为 sum、接受两个不同类型实参的函数模板,希望返回类型足够大,可以包含按任意次序传递的任意两个类型的两个值的和,怎样才能做到?应如何指定 sum 的返回类型?
// T or U as the returntype?
template <class T, class U> ??? sum(T, U);
在这个例子中,答案是没有一个形参在任何时候都可行,使用任一形参都一定会在某些时候失败:
// neither T nor U works as return type
sum(3, 4L); // second type is larger; want U sum(T, U)
sum(3L, 4); // first type is larger; want T sum(T, U)
解决这一问题的一个办法,可能是强制 sum 的调用者将较小的类型强制转换(第 5.12.4 节)为希望作为结果使用的类型:
// ok: now either T or U works as return type
int i; short s;
sum(static_cast<int>(s), i); // ok: instantiates int sum(int, int)
★这个办法我就压根就没看明白作者想要表达的意思,我试了下,见下面代码(IDE: VS2010)
#include <iostream>using namespace std;template <typename T, typename U> U sum( const T& v1, const U& v2 ) //这里我试了下,U或者T作为返回值类型都可以{ return v1 + v2; }int main( void ){ long v3 = sum(3, 4L); cout<<v3<<endl; return 1;}#include <iostream>using namespace std;template <typename T1, typename T2, typename T3> T1 sum( const T2& v1, const T3& v2 ){ return v1 + v2; }int main( void ){ long v3 = sum<long>(3, 4L); //这里我还是按照原来书中说是错误的方法写的,编译运行一切OK cout<<v3<<endl; return 1;}#include <iostream>using namespace std;template <typename T, typename U> U sum( const T& v1, const U& v2 ){ return v1 + v2; }int main( void ){ char c = 123; long lng = 456; long v3 = sum(lng, c); cout<<v3<<endl; return 1;}
[解决办法]
这时候根据显式模板实参,T1是char,然后根据模板实参推断出T2是long,然后T1根据c的类型推断出char,所以T3是什么类型编译器无法得知。然后我试了下T1到底是什么类型,下边的代码似乎说明T1是靠显式模板参数来初始化的
你整体把我看的都有点晕晕的。
-
T1代码中显示初始化是long怎么是char?
T3无法得知类型,是上面代码,还是下面的代码?似乎你的说法都不成立。
-
模板其实你就把类型当成参数看就好了。
没那么复杂。