//cc36a_demo-txwtech-c++_CppPrimer_函数模板
//函数模板-》实例化-》函数
//模板形参,T就是形参
//template <typename T> //typename与class写法都可以-建议用这个,避免与类的class混淆
//template <class T>,这个<class T>与c++类的class没有关系
//调用什么类型-函数模板自动匹配函数的类型,自动变成相应类型
//3.顺序队列 //内部是数组--类模板
//4.链式队列 //内部是链表--类模板
//cc36a_demo-txwtech-c++_CppPrimer_函数模板
//函数模板-》实例化-》函数
//模板形参,T就是形参
//template <typename T> //typename与class写法都可以-建议用这个,避免与类的class混淆
//template <class T>,这个<class T>与c++类的class没有关系
//调用什么类型-函数模板自动匹配函数的类型,自动变成相应类型//3.顺序队列 //内部是数组--类模板
//4.链式队列 //内部是链表--类模板
#include <iostream>
#include <string>
#include <fstream> //文件流
#include <sstream>//字符串流using namespace std;
//int compare(const double &v1,const double &v2)
//{
// if (v1 < v2) return -1;
// if (v1 > v2) return 1;
// return 0;
//}
//int compare(const string &v1, const string &v2)
//{
// if (v1 < v2) return -1;
// if (v1 > v2) return 1;
// return 0;
//}//用函数模板来写//函数模板例子1
template <typename TT>//TT代表任意一种类型
int compare(const TT &v1, const TT &v2) //函数模板自动匹配函数的类型
{if (v1 < v2) return -1;if (v1 > v2) return 1;return 0;
}
//函数模板例子2
template <class T>
T absVal(T val)
{return val > 0 ? val : -val;
}
//函数模板例子3
template <typename T1, typename T2>
T1& print(T1& s,T2 val)
{s << val;return s;
}
//函数模板例子4
template <class T>
//严重性 代码 说明 项目 文件 行 禁止显示状态
//错误 C2440 “return” : 无法从“const T”转换为“T &” cc36a_demo c : \users\tt2018\documents\visual studio 2017\projects\cc36a_demo\cc36a_demo\cc36a_demo.cpp 54
//
//T& bigger(const T&v1, const T&v2)
const T& bigger(const T&v1, const T&v2) //添加一个const
{return v1 > v2 ? v1 : v2;
}int main()
{double dval = -0.88;float fval = -12.33;string oristr = "this is a test";string desstr;ostringstream oss(desstr);//输出字符串流ofstream outFile("result.dat");//输出文件流print(cout, -3) << endl;print(cout, dval) << endl;print(cout, fval) << endl;print(cout, oristr) << endl;print(outFile, -3) << endl;//文件输出流print(outFile, dval) << endl;print(outFile, fval) << endl;print(outFile, oristr) << endl;outFile.close();print(oss, -3) << endl;print(oss, dval) << endl;print(oss, fval) << endl;print(oss, oristr) << endl;//oss.close();cout << oss.str() << endl; //oss输出cout << absVal(dval) << endl;//double类型cout << absVal(fval) << endl; //float类型double d1 = 1.23;double d2 = 9.51;cout << compare(d1, d2) << endl;string s1("zhi");string s2("world");cout << compare(s1, s2) << endl;//传引用double a = 1.22;double b = 6.89;cout << bigger(a,b) << endl;cout << bigger(s1, s2) << endl;getchar();return 0;
}