//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;
}