您的位置:首页 > 编程语言 > C语言/C++

C++模板的特化(函数模板特化,类模板特化)与实例化区别联系

2018-03-09 14:41 441 查看
一:实例化什么是实例化:一个通过使用具体值替换模板参数,从模板产生的普通类,函数的过程

1.显示实例化:通过指定的类型,表明要实例化的类型



2.隐式实例化:通过编译器自己推演,判断出要实例化的类型 


二 :特化=具体化类模板特化类模板
template<class T1,class T2>
class Date
{
public:Date()
{
cout << "Date(T1,T2)" << endl;
}
private:
T1 _a;
T2 _b;
};
template<class T1, class T2>
class Date
{
public:Date();
private:
T1 _a;
T2 _b;
};
template<class T1,class T2>
Date<T1, T2>::Date()
{
cout << "Date(T1,T2)" << endl;
}


类模板全特化
template<class T1,class T2>//模板
class Date
{
public:Date()
{
cout << "Date(T1,T2)" << endl;
}
private:
T1 _a;
T2 _b;
};
template<>//全特化
class Date<int, char>
{
public:Date();
private:
int _a;
char _b;
};
//全特化在类外定义成员函数    ---------不再需要模板形参
Date<int,char>::Date()
{
cout << "Date(int,char)" << endl;
}
int main()
{
Date<int,char> d3;
system("pause");
return 0;
}


类模板偏特化  //局部特化情况一:局部特化第二个参数
template<class T1, class T2>
class Date
{
public:Date()
{
cout << "Date(T1,T2)" << endl;
}
private:
T1 _a;
T2 _b;
};
template<class T1>//偏特化
class Date<T1, double>
{
public:Date();
private:
T1 _a;
double _b;
};
template<class T1>//偏特化在类外定义类的成员函数必须加上模板形参
Date<T1, double>::Date()
{
cout << "Date(T1, double)" << endl;
}
int main()
{
Date<int, double> d3;
system("pause");
return 0;
}


情况二:局部特化两个参数为指针类型
template<class T1, class T2>//模板
class Date
{
public:Date();
private:
T1 _a;
T2 _b;
};
template<class T1, class T2>//偏特化两个参数为指针类型
class Date<T1*, T2*>
{
public:Date();
private:
T1 a;
T2 b;
T1* _a;
T2* _b;
};

template<class T1, class T2>//偏特化在类外定义类的成员函数必须加上模板形参
Date<T1*, T2*>::Date()
{
cout << "Date(T1*,T2*)" << endl;
}
int main()
{
Date<int*, int*> d3;
system("pause");
return 0;
}
由上面例子可得到:模板全特化和偏特化都是在已定义模板的基础上,不能单独存在。

4000

从情况二可看出,1.偏特化不仅仅是指特殊部分参数,2.而且针对模板参数更进一步的条件限制,设计出来的一个特化版本函数模板特化函数模板全特化注意:显示实例化只有声明,无定义,而特化有定义。
//===============================对于函数模板===============================================//
#define Max 125
struct work
{
char name[Max];
int money;
};
template<class T>
void Swap(T& a, T& b)
{
T tmp = a;
a = b;
b = tmp;
}
template
void Swap<int>(int& a, int& b);//显示实例化 无需给该函数重新编写函数体,这只是个声明
template <> void Swap<work>(work& a, work& b)//特化  注意与实例化区分开,必须有定义
{
int money = a.money;
a.money = b.money;
b.money = money;

}


函数模板偏特化函数模板没有偏特化,可以通过函数重载实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: