函数模板显式具体化、显式实例化
显式实例化声明
使用foo()模板生成一个int类型的函数定义。实例化:从一个模板里出来的,大家都是一样的。
显式具体化声明
不要使用foo()模板来生成函数定义,而应该使用专门为int类型显式定义的函数定义。这些原型必须有自己的函数定义,相当于函数重载。具体化:各有各的不同。
template<typename T>
void foo(T t)
{
...
}
template<>
void foo<char*>(char* pstr);
template void foo<int>(int i);
template<>
void foo<double>(double d)
{
...
}
int main()
{
int i = 10;
double d = 1.2;
float f = 1.4;
foo(f);
foo(d);
foo(i);
}
第一个:显式实例化,在main 之前,foo 函数模板就为foo<int> 创建了定义
第二个:显式具体化,使用double 类型重载了foo 函数模板
第三个:隐式实例化,在main 函数中调用时,根据实参类型实例化的模板函数
函数模板的特化必须是全特化,指定为具体某个类型。如果嵌套在类模板里,若将函数模板具体化,则需要在类内定义;若将函数模板实例化,只需将其显式实例化声明。如:
template<typename T>
void eat(T t);
template<typename T>
class Cat
{
public:
friend void eat(Cat<T>& t)
{
}
private:
T food;
}
template<typename T>
void eat(T t)
{
}
template<typename T>
class Cat
{
public:
friend void eat<> (Cat<T>& t)
private:
T food;
}
匹配规则优先级
显式调用 > 隐式调用
具体 > 模糊
|