函数模板初探

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/c++ 函数模板初探的更多相关文章

  1. 25.C++- 泛型编程之函数模板(详解)

    本章学习: 1)初探函数模板 2)深入理解函数模板 3)多参函数模板 4)重载函数和函数模板 当我们想写个Swap()交换函数时,通常这样写: void Swap(int& a, int&am ...

  2. C++中函数模板的概念和意义

    1,对泛型编程进行学习,泛型编程是实际工程开发中必用的技术,大型公司的通用 库都是采用泛型编程的技术完成的,C++ 中支持泛型编程技术,C++ 中的函数  模板和类模板就是 C++ 中泛型编程技术,本 ...

  3. c++函数模板作为类的成员函数,编译报错LNK2019的解决方法

    为了使某个类的成员函数能对不同的参数进行相同的处理,需要用到函数模板,即template<typename T> void Function(). 编译时报错LNK2019 解决方法: 1 ...

  4. C++STL - 函数模板

    模板主要是为了泛型编程,做到与类型无关 模板有函数模板和类模板,本文主要整理的是函数模板 1.函数模板定义 template<typename 类型形参1,typename 类型形参2,...& ...

  5. 使用getopt_long来解析参数的小函数模板

    getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct o ...

  6. C++函数重载和函数模板

    1.函数重载 这是小菜鸟写的一个例子. 函数重载应该注意以下几点: 1.1重载函数有类似的功能: 1.2只能以参数的类型(形参个数和类型)来重载函数, int max(int a,int b);flo ...

  7. 零值初始化&字符串常数作为函数模板参数

    1.在定义一个局部变量时,并希望该局部变量的初始化一个值,可以显示调用其默认构造函数,使其值为0(bool类型默认值为false). template <typename T> void ...

  8. 让gcc支持成员函数模板的trick

    让gcc支持成员函数模板的trick 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议   gcc 4.7.3 不支持成员 ...

  9. 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板

    [源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...

随机推荐

  1. 定时备份 MySQL 并上传到七牛

    多数应用场景下,我们需要对重要数据进行备份.并放置到一个安全的地方,以备不时之需. 常见的 MySQL 数据备份方式有,直接打包复制对应的数据库或表文件(物理备份).mysqldump 全量逻辑备份. ...

  2. Linux 命令 —— iconv 转换编码

    iconv 是 Linux 系统自带的用于转换文件编码的命令行工具. 命令参数 使用 iconv --help 命令查看命令帮助信息: 用法: iconv [OPTION...] [-f ENCODI ...

  3. OpenCV入门之寻找图像的凸包(convex hull)

    介绍   凸包(Convex Hull)是一个计算几何(图形学)中的概念,它的严格的数学定义为:在一个向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包.   在图像处理过程中,我们 ...

  4. [转]git commit之后,想撤销commit

    本文转自:http://www.cnblogs.com/lfxiao/p/9378763.html 写完代码后,我们一般这样 git add . //添加所有文件 git commit -m &quo ...

  5. eclipse项目导入之后,项目内无报错,项目头有红色叉号。

    解决方法:右击项目之后选择properties,先看buildpath是不是有不一样的地方需要改成自己用的jdk与tomcat 之后看是否是项目之前用的tomcat与自己的不一样,如图 再更改过之后问 ...

  6. WPF里ItemsControl的分组实现 --listbox 实现分组

    我们在用到ItemsControl时,有时会用到分组,如ListBox,ListView,DataGrid.WPF的ItemsControl可以实现分组,是依托于GroupStyle,以ListBox ...

  7. 服务器文档下载zip格式

    刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Core.Utility;@{ s ...

  8. 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法(第二次修改)

    1.线程栈 window的一个进程加载clr.该进程可能含有多个线程,线程创建的时候会分配1MB的栈空间. 如图: void Method() { string name="zhangsan ...

  9. 如何使用@vue/cli 3.0在npm上创建,发布和使用你自己的Vue.js组件库

    译者按: 你可能npm人家的包过成千上万次,但你是否有创建,发布和使用过自己的npm包? 原文: How to create, publish and use your own VueJS Compo ...

  10. input 属性为 number,maxlength不起作用如何解决?

    <input type="text"  maxlength="5" />   效果ok, 当 <input type="number ...