C++中函数模板,显式具体化,显式实例化:

函数模板

形如:

template<typename T>  //没有分号

void func(T &a,T &b);

称为函数模板,其中,template和typename为关键字,typename可以用class来替代。T(可以用其他的名称)表示一种泛型,既可以表示int型,也可以表示double或其他类型,将它想象成C++里面的数据类型的集合。

也就是说:

void func(T &a,T &b)= void func(int &a,int &b)

= void func(double &a,double &b)

= void func(char &a,char &b)

=………

在调用func()函数的时候,会根据形参的类型来选择用哪个func()函数,可以减少代码量。

函数模板也可以重载,如将形参换成两种不同的数据类型:

template<typename T1,typename T2>

void func(T1 &a,T2 &b);

或者是这种:

template<typename T>

void func(T &a,T &b T&c);

对于函数的模板,每次调用函数时的形参的类型可能不一样,但函数体里实现的内容其实都一样。比如下面的代码:

template<typename T>

T func(T &a,T &b)

{

return a>b?a:b;

}

实现的内容都是:返回啊a,b中较大的数。

显式具体化

但对于某些特殊类型,可能不适合模板实现,需要重新定义实现,此时就是使用显式具体化。

首先的声明一个函数模板,然后再定义特殊类型,如下:

template<typename T>

void func(T &a,T &b);//首先声明函数模板

//例如结构体类型的变量不适合,那么我们需要将函数模板再具体一些

struct strc {……};//结构体

template<>void func<strc>(strc &t1,strc &t2);

然后再在主函数后面写出实现方法。

//函数模板的实现

template<typename T>

void func(T &a,T &b)

{……}

//显式具体化的实现

template<>void func<strc>(strc &t1,strc &t2)

{……}

实例化

假如我们在主函数中要调用函数模板,他就会在主函数中创建一个实例,不调用它就不会产生实例,比如a,b都是int型的,在主函数中有这一句: func(a,b);那么就会创建void func(int,int)这样一个函数,这种叫隐式实例化。后面有程序用了,编译器才会根据模板生成一个实例函数。

还有一种叫显式实例化,不用将相应的实参传递给形参才创建实例,而是显示的声明需要程序创建这个实例,在函数体里声明:

template void func<char>(char &,char &);

无论是否程序有用,编译器都会生成一个实例函数。

显式实例化和显式具体化声明注意区分。一个template后有<>,一个则没有。

原文地址:https://www.cnblogs.com/LiuFarrell/p/8955446.html

时间: 2024-11-05 13:41:43

C++中函数模板,显式具体化,显式实例化:的相关文章

c++中函数模板的使用

在程序设计中,经常要使用到函数体相同的函数,如果我们要根据所使用的参数表不同来决定调用具体哪个函数时,我们经常使用的方式是进行函数重载,但是当我们的函数很多的时候会发现实现起来很不方便.所以c++提供了函数模板的概念,这和类模板实现起来的方式是类似的. 下面举个例子,我们经常要使用的冒泡排序算法,被排序的对象可能是double,int,char,float等等,下面是实现代码: template <typename T1,typename T2> void bubble(T1 *A, T2 l

C++中函数模板template和函数参数为指针,且有返回值的结合使用

1 #include<iostream> 2 using namespace std; 3 // 利用模板函数计算一个表达式 4 template<class Type> 5 Type Abc(Type a,Type b,Type c) 6 { 7 return a+b+c; 8 } 9 // 利用引用参数指针计算一个表达式 10 template<class Type> 11 Type ABC(Type *a,Type *b,Type *c) 12 { 13 retu

C++中函数模板template的使用

下面以一个简单程序演示一下函数模板的使用: 1 #include<iostream> 2 using namespace std; 3 template<class Type> 4 Type Abc(Type a,Type b,Type c) 5 { 6 return a+b+c; 7 } 8 int main() 9 { 10 int a=1,b=2,c=3; 11 cout<<"a= "<<a<<",b= &qu

第57课 深入理解函数模板

1. 函数模板深入理解 (1)编译器从函数模板通过具体类型产生不同的函数 (2)编译器会对函数模板进行两次编译 ①对模板代码本身进行编译 ②对参数替换后的代码进行编译(编译时机:可能发生在定义对象或函数调用时) (3)注意事项 ①函数模板本身不允许隐式类型转换 ②自动推导类型时,必须严格匹配 ③显式类型指定时,能够进行隐式类型转换 [编程实验]函数模板的本质 #include <iostream> #include <string> using namespace std; cla

类模板和函数模板

函数模板: 函数模板全特化:所谓特化,是指相对普通模板的特化,是另外一个模板.但不是实例,只是模板 template <class T>                                      //普通函数模板,泛型T mymax(const T t1, const T t2){   return t1 < t2 ? t2 : t1;} template <>const char* mymax(const char* t1,const char* t2)  

函数模板(四十七)

我们到目前为止,学习了 C++ 这么久.提个小问题:在 C++ 中有几种交换变量的方法呢?通过定义宏代码块和定义函数.下来我们做个实验 #include <iostream> #include <string> using namespace std; #define SWAP(t, a, b)    do                       {                            t c = a;                 a = b;      

C++解析(26):函数模板与类模板

0.目录 1.函数模板 1.1 函数模板与泛型编程 1.2 多参数函数模板 1.3 函数重载遇上函数模板 2.类模板 2.1 类模板 2.2 多参数类模板与特化 2.3 特化的深度分析 3.小结 1.函数模板 1.1 函数模板与泛型编程 C++中有几种交换变量的方法? 交换变量的方法--定义宏代码块 vs 定义函数: 定义宏代码块 优点:代码复用,适合所有的类型 缺点:编译器不知道宏的存在,缺少类型检查 定义函数 优点:真正的函数调用,编译器对类型进行检查 缺点:根据类型重复定义函数,无法代码复

C++--模板的概念和意义、深入理解函数模板、类模板的概念和意义

一.模板的概念与意义 Q:C++中有几种交换变量的方法?定义宏代码与定义函数A.定义宏代码优点:代码复用,适合所有的类型缺点:编译器不知道宏的存在,缺少类型检查B.定义函数优点:真正的函数调用,编译器对类型进行检查缺点:根据类型重复定义函数,无法代码复用 C.泛型编程--不考虑具体数据类型的编程方式Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意的数据类型C++中的泛型编程函数模板--一种特殊的函数可用不同类型进行调用,看起来和普通函数很相似,区别是类型可被参数化函数模板的语法规则1.

实验2:函数重载、函数模板、简单类的定义和实现

实验目的 1. 掌握c++中函数的声明.定义.调用和参数传递方式 2. 掌握c++中带有默认形参值的函数声明和定义方法 3. 理解函数重载,掌握c++中函数重载的实现方式 4. 理解函数模板,掌握c++中函数模板的简单使用 5. 理解面向对象的抽象和封装,掌握c++中类的定义.实现和使用方法 实验准备 1. 函数的声明.定义.调用.参数传递方法 2. 带有默认形参值的函数 3. 函数重载 4. 函数模板(9.1.1节 + 9.3节) 其中,9.3节,理解3个常用的排序算法和两个常用的查找算法 5