静多态(Static Polymorphism)是多态性的一种,绑定发生在编译期(compile-time)(称为静态绑定static-binding)。
非参数化多态和参数化多态并不冲突,而且相辅相成,它们混合使用能够带来更大的灵活性,函数模板重载就是很好的例子。
#include<iostream>
#include<stdio.h>
using namespace std;
template<typename T>
bool compare(const T a, const T b) {
cout << "bool compare(const T a, const T b)" <<
typeid(a).name() << " " << typeid(b).name()<<endl;
return a > b;
}
template<typename T, typename E> //重载
bool compare(const T a, const E b) {
cout<< "bool compare(const T a, const E b)" <<
typeid(a).name() << " " << typeid(b).name()<<endl;
return a > b;
}
template<> //特例化
bool compare<char *>(char *const a, char *const b) {
cout <<"bool compare<char *>(char *const a, char *const b)" <<
typeid(a).name() << " " << typeid(b).name()<<endl;
return strcmp(a, b) > 0;
}
int main() {
compare(16, 17.6); //模板重载
compare(10, 20); //非特例化
compare("aaa", "bbb"); //特例化
return 0;
}
函数模板用来实例化函数,在编译期根据模板函数使用处的参数自动生成一份该函数的代码,函数的入口地址就是生成函数代码的入口地址。
对于函数重载重载,C++中不允许只有函数类型(返回值)不同的重载:
值得注意的是,对于char *类型,与const结合时会产生二义性,需要记住一条规律:const修饰的是左边或右边第一个完整类型。
bool compare(const T a, const T b) //一般模板
bool compare<char *>(char *const a, char *const b) //特例化模板
是否觉得const 位置有些奇怪,最初可能会有这种貌似很正确的想法。对模板进行特例化,将所有出现T的位置都换成char *不就好了嘛?试想一下,换掉之后变成什么了?
bool compare<char *>(const char * a, const char * b) //错误示例
对于非特例化模板,const修饰的类型是T,那么当明确T是char *时,其意义是不是指向的内容不能改变而不是指向不能改变?对,没错,就是这样,这一点很值得注意。