如何进行C++模板显式具体化的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
模板函数虽然非常好用,但是也存在一些问题。比如有的操作并不是对所有类型都适用的,针对这种情况C++提供了一个解决方案,就是针对特定类型提供具体化的模板定义。这里的具体可以理解成类型的具体。
我们来看一个C++ Primer当中的例子,假设现在我们有一个结构体叫做job:
struct job { string name; double salary; int floor;}
对于结构体是可以整体赋值的,所以之前的Swap
函数对它一样适用。
template <typename T>void Swap(T &a, T &b) { T temp = a; a = b; b = temp;}
但我们现在希望在交换结构体的时候,只是交换salary
和floor
这两个字段,把name
保持不变。由于我们希望引入逻辑变化,所以直接调用Swap函数就不可行了。
当然我们可以不用函数模板,直接重载函数:
void Swap(job &a, job &b) { // swap为std自带的交换函数,在algorithm头文件中 swap(a.salary, b.salary); swap(a.floor, b.floor);}
由于C++当中规定,非函数模板的优先级大于函数模板,所以我们在对job结构体调用Swap函数的时候,会优先使用这个。
除此之外,我们还可以提供一个具体化的模板函数:
template <> void Swap<job> (job &a, job &b) { swap(a.salary, b.salary); swap(a.floor, b.floor);}
这个函数的写法看起来有些特殊,我们在函数类型之前加上了template <>,在函数名后面又跟上了<job>。它表示的是这是一个函数模板的显式具体化,也可以理解成为之前的函数模板提供一个job类型的版本。C++当中规定显式模板函数的优先级高于普通模板函数。
看完上述内容,你们掌握如何进行C++模板显式具体化的分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!