c++用模板实现泛型,关键字是 template 相当于其他语言的泛型
函数模板
模板当调用的时候要给出明确类型,然后编译器根据类型生成多个不同的函数定义,例如调用了3次,不同的3个类型,那么编译器就在汇编的时候call了3个不同的函数地址,都是不同的类型函数定义 格式 template 或者 template typename 和 class 可以互换,完全等价
template <typename T>
template <class T>
多个不同的类型,要单独为每个类型设置一个 typename,如下:
template <typename T1,typename T2>
void show(T1 a,T2 b)
代码示例
using namespace::std;
template <typename T>
T add(T a, T b){
return a + b;
}
template <typename T1,typename T2>
void show(T1 a,T2 b){
cout << a <<endl <<b<<endl;
}
class Person{
public:
int age = 0;
Person(int a):age(a){}
Person operator + (Person & person){
return Person(this->age + person.age);
}
};
int main(int argc, const char * argv[]) {
cout<< add<int>(1,2)<<endl;
cout << add(3,4)<<endl;
cout << add(3.11,4.11)<<endl;
cout << sub(1,2)<<endl;
Person a = Person(3);
Person b = Person(10);
cout << add(a,b).age <<endl;
show(3, 3.14);
show("abc", 789);
}
类模板
- 类模板跟函数模板一样,只是放在类的开头
- 类外定义函数,如果函数包括泛型,需要写template 和类型,并且在类名后面添加泛型类型 ,例如:
template <typename T>
void Person<T>::setAge(T age)
代码示例
template <typename T>
class Person{
T age;
public:
friend ostream &operator << (ostream &cout,Person<T> & person);
Person(T a):age(a){}
Person operator + (Person & person){
return Person(this->age + person.age);
}
void setAge(T age);
};
template <typename T>
void Person<T>::setAge(T age){
age = age;
cout << "setAge() = "<< age <<endl;
}
template <typename T>
ostream &operator << (ostream &cout,Person<T> & person){
cout <<"age = " << person.age;
return cout;
}
int main(int argc, const char * argv[]) {
Person<int> a = Person<int>(3);
Person<int> b = Person<int>(10);
a = a + b;
Person<int> c = a+b;
cout << c <<endl;
a.setAge(33);
}
|