当函数模版遇上函数重载

demo 1

#include <iostream>
using namespace std;

//让 类型参数化 ===, 方便程序员进行编码
// 泛型编程
//template 告诉C++编译器 我要开始泛型编程了 .看到T, 不要随便报错
template <typename T>
void myswap(T &a, T &b)
{
	T c = 0;
	c = a;
	a = b;
	b = c;
	cout << "hello ....我是模板函数 欢迎 calll 我" << endl;
}

void myswap(int a, char c)
{
	cout << "a:" << a << "c:" << c << endl;
	cout << "我是普通函数 欢迎来访" << endl;
}

void main()
{
	int		a = 10;
	char	c = 'z';

	myswap(a, c); // 普通函数的调用:  可以进行隐式的类型转换
	myswap(c, a); // 调用函数模版

	myswap(a, a); // 函数模板函数的调用(本质:类型参数化): 将严格的按照类型进行匹配,不会进行自动类型转换

	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

通过demo 1可以得到:

函数模板和普通函数区别结论:

1、函数模板不允许自动类型转化;

2、普通函数能够进行自动类型转换;

demo 2

/*
函数模板不允许自动类型转化
普通函数能够进行自动类型转换
*/

#include "iostream"
using namespace std;

int Max(int a, int b)
{
	cout<<"int Max(int a, int b)"<<endl;
	return a > b ? a : b;
}

template<typename T>
T Max(T a, T b)
{
	cout<<"T Max(T a, T b)"<<endl;
	return a > b ? a : b;
}

template<typename T>
T Max(T a, T b, T c)
{
	cout<<"T Max(T a, T b, T c)"<<endl;
	return Max(Max(a, b), c);
}

void main()
{
	int a = 1;
	int b = 2;

	cout<<Max(a, b)<<endl; //当函数模板和普通函数都符合调用时,优先选择普通函数
	cout<<Max<>(a, b)<<endl; //若显示使用函数模板,则使用<> 类型列表

	cout<<Max(3.0, 4.0)<<endl; //如果 函数模板产生更好的匹配 使用函数模板

	cout<<Max(5.0, 6.0, 7.0)<<endl; //重载

	cout<<Max('a', 100)<<endl;  //调用普通函数 可以隐式类型转换
	system("pause");
	return ;
}

通过demo 2的分析可以得到:

函数模版和普通函数在一起的调用规则:

1、函数模版可以像普通函数一样被重载;

2、C++编译器优先考虑普通函数;

3、如果函数模版可以产生一个更好的匹配,那么选择模版;

4、可以通过空模版实参列表的语法限定编译器只通过模版匹配;

记住这4点,就能避免很多错误了

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 08:54:18

当函数模版遇上函数重载的相关文章

函数模板遇上函数重载

当函数模板的名称和普通函数的名称一样时,会发生函数重载. 1 #include <iostream> 2 using namespace std; 3 4 //函数模板 5 template <typename T> 6 void myfun(T& x,T& y) 7 { 8 cout<<"我是函数模板"<<endl; 9 } 10 11 //普通函数 12 void myfun(int a,char c) 13 { 14

C++ 函数模版运用

c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表.这个通用函数就成为函数模板.凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需在模板中定义一次即可.在调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函 数的功能. 1)c++提供两种模板机制:函数模板和类模板 2)类属 - 类型参数化,又称参数模板 使得程序(算法)可以从逻辑上抽象,把被处理的对象(数据)类型

为什么不要特化函数模版?

/* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm;

函数 的 重载 和 函数 模版

1 //函数的重载对一个函数名 赋予它 多重意义 就成为函数的重载 2 //在函数重载的基础上 我们仍然对那种 实现功能相似 3 // 但是 函数类型和形参不确定的 情况下 产生了 函数 模版 4 #include<iostream> 5 using namespace std; 6 template<class T> //模版声明 其中 T 为类型参数 7 T max(T a,T b,T c) //定义一个 通用模版 8 { 9 if(b>a) 10 a=b; 11 if(

为什么会有函数模版

demo 1 // 函数的业务逻辑 一样 // 函数的参数类型 不一样 void myswap01(int &a, int &b) { int c = 0; c = a; a = b; b = c; } void myswap02(char &a, char &b) { char c = 0; c = a; a = b; b = c; } void main() { { int x = 10; int y = 20; myswap01(x, y); printf("

初探C++函数模版学习笔记

泛型程序设计 特点:算法实现时不指定具体要操作的数据的类型.算法实现一遍但可适用于多种数据结构. 优势:减少重复代码的编写. 实现:大量编写模板, 使用模板的程序设计. 函数模版 为了交换两个int变量的值, 需要编写如下Swap函数: void Swap(int & x, int & y) { int tmp = x; x = y; y = tmp; } 为了交换两个double型变量的值, 还需要编写如下Swap函数: void Swap(double & x, double

C++编译器函数模版机制剖析 - 函数模版的本质

思考:为什么函数模板可以和函数重载放在一块.C++编译器是如何提供函数模板机制的? demo 1 #include <cstdio> #include <iostream> using namespace std; // 1.cpp // g++ -S 1.cpp -o 1.s template <typename T> void myswap(T &a, T &b) { T c = 0; c = a; a = b; b = c; cout <&l

C++函数模版的简单使用

模版算是C++的独有特性吧,也算是C++中比较难的地方,我平时开发的时候用的非常少,或者几乎没有用到,需要模版的地方是能看懂框架中相关的代码: 模版函数相对还是很简单的,引入模版的目的在于代码的重用:比如算法相似,但是由于数据类型不同,我们不得不把同样的一份代码拷贝两次,而仅仅是为了修改数据类型,那么在引入了函数模版之后,我们可以仅仅用一份代码而表示不同重载函数. 下面介绍一下最简单的函数模版的应用: template <typename T> //定义一个抽象的数据类型T T myMax(T

浅显易懂的单模版类——————(与函数模版的区别)

模版类是抽象的,必须进行具体类型,而函数模版则不一定 #include<iostream> #include<string> using namespace std; template < typename T>//定义模版不能加分号 class A { public: A(T a) { this->a = a; } T &get() { return a; } private: T a; }; int main() { A<int> a1(1