1楼:匿名用户
template
voidfun(aa){}
template<>
voidfun(inta)//显式具体化voidmain()
谁能帮我解释下c++函数模板显示实例化?
2楼:物理公司的
template
voidfun(aa){}
template<>
voidfun(inta)//显式具体化voidmain()
模板在需要的时候才会实例化
c++函数模板的显示实例化有什么好处?我知道 显示具体化就是使它特殊化,显示实例化就是手动实例化?
3楼:匿名用户
明确实例化点。例如
template
voidf(t&t)
classa{};
voidg(consta&a);//函数1template<>voidf(a&t);//显式实例化
voidg(a&a)
c++函数模版显示实例化声明: 5
4楼:校园古惑仔
将你的t替换成具体类型即可:
templateint add(int (&s)[size]);
c++模板实例化是啥意思?
5楼:匿名用户
就是根据使用模板时所给定的具体数据类型,生成采用特定模板参数组合的具体类或函数(实例)的过程
c++为什么存在显式实例化,显式具体化两种显式声明
6楼:匿名用户
1>显式具体化
显式具体化也是基于函数模板的,只不过在函数模板的基础上,添加一个专门针对特定类型的、实现方式不同的具体化函数。
[cpp]view plaincopy
template<>voidswap(job&a,job&b)
如上所示,该具体化函数的实现与模板并不一致,编译器解析函数调用时会选择最匹配的函数定义。
2>定义同名常规函数
[cpp]view plaincopy
voidswap(job&a,job&b)
由于编译器在重载解析时,会选择最匹配函数定义,所以在调用swap(joba, jobb)时,编译器会选择void swap(job &a, job &b)函数定义,而屏蔽了模板函数。
同时,模板函数也可以重载,其操作与常规函数一致。
[cpp]view plaincopy
templatevoidswap(t&a,t&b);
templatevoidswap(t&a,t&b,t&c);
templatevoidswap(t&a,t&b)
templatevoidswap(t&a,t&b,t&c)
上面主要说的是函数模板的具体化,下面说下模板实例化。
函数模板:
[cpp]view plaincopy
#definemaxname128
structjob
;template
voidswap(t&a,t&b)
;templatevoidswap(int&a,int&b);//显式实例化,只需声明
template<>voidswap(job&a,job&b)//显式具体化(上面已经讲过,注意与实例化区分开,必须有定义)
;//explicitespecialization.
类模板:
[cpp]view plaincopy
template
classarrary
;//templateclassdeclaration.
templateclassarray;//explicitinstantiation.显式实例化
template<>classarray
;//expicitspecialization.显式具体化,类定义体可以不同于类模板array
相应的,隐式实例化指的是:在使用模板之前,编译器不生成模板的声明和定义实例。只有当使用模板时,编译器才根据模板定义生成相应类型的实例。如:
int i=0, j=1;
swap(i, j); //编译器根据参数i,j的类型隐式地生成swap(int &a, int &b)的函数定义。
arrayarval;//编译器根据类型参数隐式地生成array类声明和类函数定义。
显式实例化:
当显式实例化模板时,在使用模板之前,编译器根据显式实例化指定的类型生成模板实例。如前面显示实例化(explicit instantiation)模板函数和模板类。其格式为:
template typename function(argulist);
template class classname;
显式实例化只需声明,不需要重新定义。编译器根据模板实现实例声明和实例定义。
显示具体化:
对于某些特殊类型,可能不适合模板实现,需要重新定义实现,此时可以使用显示具体化(explicite specialization)。显示实例化需重新定义。格式为:
template<> typename function(argu_list);
template<>class classname;
综上:template<> void swap(job &a, job &b) ;是函数模板的显式具体化,意思是job类型不适用于函数模板swap的定义,因此通过这个显式具体化重新定义;也可简写作template<> void swap(job &a, job &b);
template void swap(job &a, job &b);是函数模板的一个显式实例化,只需声明,编译器遇到这种显式实例化,会根据原模板的定义及该声明直接生成一个实例函数,该函数仅接受job型。否则编译器遇到模板的使用时才会隐式的生成相应的实例函数。
7楼:匿名用户
around mexico's day
关于c++函数模板与实例化
8楼:匿名用户
有一个函数是void func(int*(int&, int&)),这是表示func的形参是一个指向一个函数的指针?
应该是它的参数是个函数指针吧。
晕 。。。才发现你后面自己懂了。。。。
在c++中模板的显式具体化感觉可以用常规函数替代的,模板的显式具体化有什么特别与常规函数的吗
9楼:沦落人
我觉得完全可以代替。
但是这样做显得很系统吧,就比如你有一个模板,只有int处理方式不同,那么把int具体化,显得很系统很规整。当然直接写一个普通的int函数来屏蔽模板也是可以的,只是看上去就没那么整齐,可读性降低了。
10楼:如果
模板template的作用就是重载和**复用,就是为了简化你书写的**。显示具体化就是使用模板的一种方法,把类型,参数选定了;当然还有显示实例化和隐式实例化...