64,646
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<cstring>
#include<typeinfo>
using namespace std;
template<class T>class D
{
public:
D(T x,T y):m_x(x),m_y(y){}
int compare(void)
{
cout<<"Type of m_x is "<<typeid(m_x).name()<<endl;
cout<<"Type of m_y is "<<typeid(m_y).name()<<endl;
if(m_x<m_y)
return -1;
if(m_x>m_y)
return 1;
return 0;
}
private:
T m_x;
T m_y;
};
//类的模板特化
/*template<>class D<char*>
{
public:
D(char*x,char*y):m_x(x),m_y(y){}
int compare(void)
{
cout<<"***Type of m_x is***"<<typeid(m_x).name()<<endl;
cout<<"****Type of m_y is***"<<typeid(m_y).name()<<endl;
if(strcmp(m_x,m_y)>0)
return 1;
if(strcmp(m_x,m_y)<0)
return -1;
return 0;
}
private:
char* m_x;
char* m_y;
};*/
//成员函数的特化
template<>
int D<char*>::compare(void)
{
cout<<"***Type of m_x is***"<<typeid(m_x).name()<<endl;
cout<<"****Type of m_y is***"<<typeid(m_y).name()<<endl;
if(strcmp(m_x,m_y)>0)
return 1;
if(strcmp(m_x,m_y)<0)
return -1;
return 0;
}
int main(int argc,char*argv[])
{
D<int>d1(10,20);
cout<<d1.compare()<<endl;
D<double>d2(0.1,0.2);
cout<<d2.compare()<<endl;
D<string>d3("good","better");
cout<<d3.compare()<<endl;
char sz1[]="courage";
char sz2[]="excellent";
D<char*>d4(sz1,sz2);//比较的是两个字符指针
cout<<d4.compare()<<endl;
return 0;
}
template <typename T1, typename T2>
struct some_type_1 {}; // 主模板
template <>
struct some_type_1<int, int> {}; // 全特化
template <typename T>
struct some_type_1<T, int> {}; // 偏特化
template <typename T1, typename T2>
void do_something_1(const T1&, const T2&) {} // 主模板
template <>
void do_something_1<int, int>(const int&, const int&) {} // 全特化
template <typename T>
void do_something_1<T, int>(const T&, const int&) {} // 错误
template <typename T>
struct some_type_2 {}; // 主模板
template <typename T>
struct some_type_2<T*> {}; // 这个也是偏特化
template <typename T>
void do_something_2(T) {}; // 主模板
template <typename T>
void do_something_2(T*) {}; // 看起来好像是个偏特化,其实是个重载的主模板
#include<iostream>
#include<cstring>
#include<typeinfo>
using namespace std;
template<class T>
class D
{
public:
D(T x, T y) : m_x(x), m_y(y)
{
}
int compare(void)
{
cout << "template D compare" << endl;
return 0;
}
void display() { cout << "template D display" << endl; }
private:
T m_x;
T m_y;
};
//成员函数的特化
template<>
int D<char*>::compare(void)
{
cout << "D<char*> compare" << endl;
return 0;
}
//类的模板全特化
template<>
class D<wchar_t*>
{
public:
D(wchar_t*x, wchar_t*y) : m_x(x), m_y(y), m_dont_use_me(0)
{
}
int compare(void)
{
cout << "D<wchar_t*> compare" << endl;
return 0;
}
private:
wchar_t* m_x;
wchar_t* m_y;
int m_dont_use_me; // 可以增加哦
};
int main(int argc, char*argv[])
{
D<int> d1(10, 20);
d1.compare(); // 毫无疑问输出"template D compare"
d1.display(); // ok
char sz1[] = "courage";
char sz2[] = "excellent";
D<char*> d2(sz1, sz2);
d2.compare(); // 当然是"D<char*> compare"
d2.display(); // also ok
wchar_t wsz1[3] = {0};
wchar_t wsz2[3] = {0};
D<wchar_t*> d3(wsz1, wsz2);
d3.compare();
// d3.display(); // error,没有定义
return 0;
}
成员函数特化只是说,如果T为指定的某个类型,编译器你就要负责调用这个特殊版本的成员函数(d2.compare()说明了这一点)。除了特化的成员函数之外,其他函数依然是原始模板中的定义(d2.diaplay()说明了这一点)。而类模板全特化之后,实际上跟原来的模板完全没有任何关系了。这时候你可以增删成员、函数等等(见上面的代码)。
当然,一般来说,客户希望特化的类模板能跟原来的模板拥有同样的对外接口,所以,若一定要说一个D<wchar_t*>和通用的D<T>还有什么联系的话,就是:尽量让D<wchar_t*>提供与D<T>一样的对外接口。因为用户编写泛型代码的时候,大多数时候肯定是针对D<T>编写,并且希望D<wchar_t*>一样适用。