学习要点:
1 返回值是抽象类型的函数模版要在 使用 时写上返回值的类型
2 成员函数也可以写程函数模版的形式
3 可以利用函数模版不用写参数类型的特点 便利地生成临时变量
#include <iostream>
#include <cstdlib>
using namespace std;
template <typename FROM,typename TO>
TO convertto(FROM v)
{
return TO(v);
}
template <typename TO>
TO convertto(const char *str)
{
return TO(atof(str));
}
template <typename T, typename U>
struct Pair
{
T first;
U second;
public:
Pair():first(),second(){}
Pair(const T&a,const U&b):first(a),second(b) {}
template<typename X,typename Y> //成员函数也可以写成函数模板
Pair& operator=(const Pair<X,Y> &p)
{
first =convertto<T>(p.first); //虽然函数模板参数可以让编译器自动识别,但返回值还是要标明
second = convertto<U>(p.second);
return *this;
}
};
//模板表示类型Pair<T,U>
template<typename T,typename U>
ostream& operator<<(ostream &o,const Pair<T,U> &p)
{
return o << p.first << ' ' << p.second;
}
//Pair<const char*,int>("芙蓉",18) 这样的写法很麻烦 于是就有了
//利用了函数模板不用写类型的便利
//用来写临时变量 这里不要返回引用 因为返回值是个临时变量,临时变量是const的,返回后的类型是const值的引用
template<typename T,typename U>
Pair<T,U> mp(T f,U s)
{
return Pair<T,U>(f,s);
}
int main()
{
cout << Pair<const char*,int>("芙蓉",18) << endl;
cout << Pair<int,bool>(12.1,true) << endl;
cout << mp("123",1231) << endl;
Pair<int,double> a(123,45.6);
cout << "a=" << a << endl;
a = mp("78.3","12.2");
cout << "a=" << a << endl;
}