这是一个简单的例子:
#include <iostream>
template <class T>
void print(T in){
printf("NOT printing int\n");
}
template <> // <-- template specialization
void print<int>(int in){
printf("printing int\n");
}
int main(){
print(5); // printing int
return 0;
}
但是该int
版本甚至可以不使用模板来编写,如下所示:
void print(int in){
printf("printing int\n");
}
那么这里模板专业化的重点是什么?
#include <iostream>
template <class T>
void print(){
printf("printing float\n");
}
template <>
void print<int>(){
printf("printing int\n");
}
int main(){
print<float>();
return 0;
}
关键是你不能用重载做所有事情。例如,考虑没有参数的情况:
template<class T>
void foo();
由于没有参数,因此无法重载此函数。但是它可以通过显式实例化来调用:
foo<int>();
并且这些实例化可以是专门化的。
然后是类模板特化,当然不能使用函数重载来完成。
重载可以完成的事情和模板特化可以完成的事情之间存在一些重叠。当它是一个选项时,通常认为使用重载更好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句