c/c++ 函数模板初探
程序员文章站
2022-05-25 16:22:08
函数模板初探 1,由来:有时候,函数的逻辑是一样的,只是参数的类型不同,比如下面 2,解决办法,如果参数的类型也可以作为函数的参数,就可以解决了 3,函数模板写法:template\ 4,函数模板的效率不高,编译器在编译的时候,会根据调用测提供的参数去推导出T1等的类型,并给我们生成对应类型的方法。 ......
函数模板初探
1,由来:有时候,函数的逻辑是一样的,只是参数的类型不同,比如下面
int max(int a, int b){ return a > b ? a : b; } double max(double a, double b){ return a > b ? a : b; }
2,解决办法,如果参数的类型也可以作为函数的参数,就可以解决了
t max(t a, t b){ return a > b ? a : b; }
3,函数模板写法:template<typename t1,typename t2, ...>
4,函数模板的效率不高,编译器在编译的时候,会根据调用测提供的参数去推导出t1等的类型,并给我们生成对应类型的方法。
5,下面的例子,调用的时候,可以明确给定参数的类型,max<int>(1, 2.1),这样一来,即使1和2.1的类型不同,编译也可以通过,如果只用max(1, 2.1),编译就不会通过,当然如果 max(t1 a, t2 b),也可以解决问题。
6,typeid(t).name() 返回t的类型的名字
#include <iostream> #include <typeinfo> using namespace std; class test{ friend ostream& operator<<(ostream &os, const test &t); public: test(int d = 0) : data(d){} bool operator>(const test &t){ return data > t.data ? true : false; } ~test(){} private: int data; }; ostream& operator<<(ostream &os, const test &t){ os << "test::data : " << t.data; return os; } template<typename t> t max(t a, t b){ cout << typeid(t).name() << endl; return a > b ? a : b; } int main(){ cout << max(1, 2) << endl; cout << max('a', 'b') << endl; cout << max(1.2f, 3.4f) << endl; cout << max(1.2, 3.4) << endl; test t(10); test t1(11); cout << max(t, t1) << endl; //编译不过,因为1和2.1的类型不同,但是模板函数的两个参数的类型是相同的,所以编译器不知道用哪种类型作为函数的参数了。 //cout << max(1, 2.1) << endl; cout << max(1, (int)2.1) << endl; cout << max((double)1, 2.1) << endl; cout << max<int>(1, 2.1) << endl; cout << max<double>(1, 2.1) << endl; cout << max<>(1, 2) << endl; }
推荐阅读
-
C++临时变量的回顾思考以及librdkafka设置回调函数注意点
-
《深度探索C++对象模型》之《构造函数语义学》——Default Constructor篇
-
c++ string类型成员变量在调用构造函数后未能正确赋值
-
C++入门到理解阶段二基础篇(7)——C++函数
-
C++指针与数组、函数、动态内存分配
-
【C++常用函数】头文件
中的常用函数(绝对值,交换,比较) -
C++ const常量对象、常量成员函数和常引用
-
《c++编程思想》关于虚函数在构造函数行为的理解,理解有误,望告知!
-
c/c++赋值函数(重载=号运算符)
-
c++ 模板类,方法返回值类型是typedef出来的,或者是auto,那么此方法在类外面如何定义?