#include "stdio.h"
#include "stdlib.h"
#include <typeinfo>
#include <iostream>
using namespace std;
class Sample2
{
public:
template <class T>
void print()
{printf("\nSample2 print template , ");
cout<<"print####:"<<typeid(T).name()<<endl;}
template <class T>
void print2();
};
//特化的时候template<class TypeA,class TypeB> 变为 template<>
template <>
void Sample2::print<int>()
{printf("\nSample2 print int");}
template <class T>//<class T=int>error C4519: 仅允许在类模板上使用默认模板参数
void Sample2::print2( )
{cout<<"******print2:"<<typeid(T).name()<<endl;}
//模板类的参数默认
template<class TypeA = int, class TypeB = float>
class MyClass
{
public:
TypeA value_A;
TypeB value_B;
public:
explicit MyClass(TypeA valA,TypeB valB)
{
value_A = valA;
value_B = valB;
}
MyClass(){}
~MyClass(){}
TypeA GetValueA()
{
cout<<"无特化"<<endl;
return value_A;
}
TypeB GetValueB();
//类成员函数模板类内实现
template<typename T>
void MemberFuntion(T Tval)
{
cout<<"成员函数模板的类型名: "<<typeid(T).name()<<endl;
cout<<"模板成员函数的值: "<<Tval<<endl;
}
template<typename T>
void MemberFuntion1(T Tval) ;
};
//模板类的偏特化
template<class TypeB>
class MyClass <int ,TypeB>
{
public:
int value_A;
TypeB value_B;
public:
explicit MyClass(int valA,TypeB valB)
{
value_A = valA;
value_B = valB;
}
MyClass(){}
~MyClass(){}
int GetValueA()
{
value_A=30;
return value_A;
}
TypeB GetValueB()
{
return value_B;
}
//类成员函数模板类内实现
template<typename T>
void MemberFuntion(T Tval)
{
cout<<"成员函数模板的类型名: "<<typeid(T).name()<<endl;
cout<<"模板成员函数的值: "<<Tval<<endl;
}
template<typename T>
void MemberFuntion1(T Tval)
{
cout<<"成员函数模板的类型名: "<<typeid(T).name()<<endl;
cout<<"模板成员函数的值: "<<Tval<<endl;
}
};
//默认模板参数的类模板成员函数类外定义方式,在定义这里就不用再声明默认模板参数类型了
template<class TypeA,class TypeB>
TypeB MyClass<TypeA,TypeB>::GetValueB()
{
return value_B;
}
//类成员函数模板类外实现
//必须添加两个模板参数列表(template parameter list), 第一个为类的, 第二个为成员函数的;
template<class TypeA , class TypeB > //类的参数列表
template<class T > //类成员函数模板
void MyClass<TypeA , TypeB >:: MemberFuntion1(T Tval)
{
cout<<"成员函数模板的类型名: "<<typeid(T).name()<<endl;
cout<<"模板成员函数的值: "<<Tval<<endl;
}
//特化的时候template<class TypeA,class TypeB> 变为 template<>
template<>
int MyClass<int ,int >::GetValueB()
{
value_B=50;
return value_B;
}
void main()
{
Sample2 m_sample2;
m_sample2.print<int>();
m_sample2.print<double>();
cout<<endl;
MyClass<double,int >m_sample0(5.0,3);
cout<<"a@@@@无特化@@@@@:"<<m_sample0.GetValueA()<<endl;
MyClass<> m_sample1(3,5);
cout<<"@@@@@@@@@a:"<<m_sample1.GetValueA()<<endl;
m_sample1.MemberFuntion(3.5);
m_sample1.MemberFuntion1(1);
MyClass<int,int >m_sample3(5,3);
cout<<"b全特化:"<<m_sample3.GetValueB()<<endl;
MyClass<int ,double> m_sample4(3,5.67);
cout<<"@@@@@@@@@偏特化222222a:"<<m_sample4.GetValueA()<<endl;
cout<<"b222222@@@@@@@@@:"<<m_sample4.GetValueB()<<endl;
system("pause");
}
模板类默认参数,模板类的特化,偏特化, 模板成员函数,模板的专用化例子
最新推荐文章于 2025-02-26 07:00:00 发布