code1:
/*
模版成员模版
*/
#include<iostream>
using namespace std;
template<typename V>
class Value
{
public:
Value(const V& v):m_v(v){}
V m_v;
};
template<typename K>
class Key
{
public:
Key(const K& k):m_k(k){}
K m_k;
template<typename V>
class Value
{
public:
Value(const V& v):m_v(v){}
V m_v;
};
};
int main()
{
Key<string> key("pi");
Key<string>::Value<double> value(3.1415);
cout<<key.m_k<<" "<<value.m_v<<endl;
return 0;
}code2:
/*
模版型成员变量
*/
#include<iostream>
using namespace std;
template<typename V>
class Value
{
public:
Value(const V& v):m_v(v){}
V m_v;
};
template<typename K,typename V>
class Pair
{
public:
Pair(const K& k,const V& v):m_k(k),m_v(v){}
K m_k;
Value<V> m_v;
};
int main()
{
Pair<string,double> pair("PI",3.14);
cout<<pair.m_v.m_v<<" "<<pair.m_k<<endl;
return 0;
}code3:
#include<iostream>
#include<cstring>
using namespace std;
//模板函数
template<typename T>
T max(T x,T y)
{
return x>y?x:y;
}
//函数特化
template<>
const char* max(const char * x,const char * y)
{
return strcmp(x,y)>0?x:y;
}
//通用模版类
template<typename T>
class Comp
{
public:
Comp(T x,T y):m_x(x),m_y(y){}
T min()const
{
return m_x<m_y?m_x:m_y;
}
T max() const
{
return m_x>m_y?m_x:m_y;
}
private:
T m_x;
T m_y;
};
/*
//全类特化某种类型
template<>
class Comp<const char*>
{
public:
Comp(const char* x,const char * y):m_x(x),m_y(y){}
const char* min() const
{
return strcmp(m_x,m_y)<0?m_x:m_y;
}
const char * max() const
{
return strcmp(m_x,m_y)>0?m_x:m_y;
}
private:
const char* m_x;
const char * m_y;
};
*/
//只特化成员函数
template<>
const char* Comp<const char *>::min() const
{
return strcmp(m_x,m_y)<0?m_x:m_y;
}
//只特化成员函数
template<>
const char * Comp<const char *>::max() const
{
return strcmp(m_x,m_y)>0?m_x:m_y;
}
int main()
{
cout<<::max<int>(45,33)<<endl;
cout<<::max<string>("hello","world")<<endl;
Comp<int> c1(34,20);
cout<<c1.min()<<endl;
Comp<const char *> c2("good","abc");
cout<<c2.min()<<endl;
return 0;
}code4:
/*
模版实现输出流控制
*/
#include<iostream>
#include<sstream>
using namespace std;
template<typename T>
class omanip
{
public:
omanip(ostream&(*fun)(ostream&,T),T arg):
m_fun(fun),m_arg(arg){}
friend ostream& operator<<(ostream& os,
const omanip<T>& om)
{
return om.m_fun(os,om.m_arg);
}
private:
ostream& (*m_fun)(ostream&,T);
T m_arg;
};
class color
{
public:
color(int ctrl,int bg,int fg):m_ctrl(ctrl)
,m_bg(bg),m_fg(fg){}
int m_ctrl;
int m_bg;
int m_fg;
};
ostream& colorfun(ostream& os,color args)
{
if(args.m_ctrl==-1) return os<<"