using namespace std;
template<typename A,typename B,typename C,typename D,typename E,typename F>
class CTempl
{
public:
void Fun()
{
std::cout << "CTempl<A, B, C, D, E, F>" << endl;
}
};
// 模版特化情形1
template<typename A>
class CTempl<A, A, A, A, A, A>
{
public:
void Fun()
{
std::cout << "CTempl<A, A, A, A, A, A>" << endl;
}
};
// 模版特化情形2
template<typename A, typename B>
class CTempl<A, B, B, B, B, B>
{
public:
void Fun()
{
std::cout << "CTempl<A, B, B, B, B, B>" << endl;
}
};
// 模版特化情形3
template<typename A, typename B>
class CTempl<A, A, B, B, B, B>
{
public:
void Fun()
{
std::cout << "CTempl<A, A, B, B, B, B>" << endl;
}
};
// 模版特化情形4
template<typename A, typename B>
class CTempl<A, A, A, B, B, B>
{
public:
void Fun()
{
std::cout << "CTempl<A, A, A, B, B, B>" << endl;
}
};
// 模版特化情形5
template<typename A, typename B>
class CTempl<A, B, A, B, A, B>
{
public:
void Fun()
{
std::cout << "CTempl<A, B, A, B, A, B>" << endl;
}
};
// 模版特化情形6,参数完全特化
template <>
class CTempl<int, int, double, short, char, float>
{
public:
void Fun()
{
std::cout << "CTempl<int, int, double, short, char, float>" << endl;
}
};
void AppMain()
{
/*
匹配: template<typename A> class CTempl<int, int, double, short, char, float>
*/
CTempl<int, int, double, short, char, float> obj0;
obj0.Fun();
/*
匹配: template<typename A> class CTempl<A, A, A, A, A, A>
*/
CTempl<int, long, double, short, char, float> obj1;
obj1.Fun();
/*
匹配: template<typename A, typename B> class CTempl<A, B, B, B, B, B>
*/
CTempl<int, long, long, long, long, long> obj2;
obj2.Fun();
/*
匹配: template<typename A, typename B> class CTempl<A, A, B, B, B, B>
*/
CTempl<int, int, long, long, long, long> obj3;
obj3.Fun();
/*
匹配: template<typename A, typename B> class CTempl<A, A, A, B, B, B>
*/
CTempl<int, int, int, long, long, long> obj4;
obj4.Fun();
/*
匹配: template<typename A, typename B> class CTempl<A, B, A, B, A, B>
*/
CTempl<int, long, int, long, int, long> obj5;
obj5.Fun();
}
总结:类模板实例化时,编译器会根据该实例的模版参数类型的排列特点自动地匹配合适的类模版.