C++函数的显示实例化和显式具体化是什么。?解释下这个

2020-11-26 08:58:51 字数 3630 阅读 6641

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的作用就是重载和**复用,就是为了简化你书写的**。显示具体化就是使用模板的一种方法,把类型,参数选定了;当然还有显示实例化和隐式实例化...