C++ 函数模板二(函数模板重载)

//函数模板重载
#include<iostream>
using namespace std;

/*
函数模板会进行严格的类型匹配,模板类型不提供隐式类型转化
普通函数能够进行自动类型转换
*/

/*
函数模板重载四大规则
1 函数模板可以像普通函数一样被重载
2 C++编译器优先考虑普通函数
3 如果函数模板可以产生一个更好的匹配,那么选择模板
4 可以通过空模板实参列表的语法限定编译器只通过模板匹配
*/

template<typename T>
void Test1(T a, T b){
    cout << "执行了模板函数Test1()" << endl;
}

void Test2(int a, int b){
    cout << "执行了Test2()" << endl;
}

void Test1(int a, int b){
    cout << "执行了普通函数Test1()" << endl;
}

void Test3(int a, int b){
    cout << "执行了普通函数Test3()" << endl;
}

void ProtectA(){
    int a = 1;
    int b = 2;
    char c = ‘3‘;
    //Test1(a, c);  报错   error C2782: “void Test1(T,T)”: 模板 参数“T”不明确
    /*
    因为 a是int型,c是char型  而函数模板要求两个参数都是T型 就是说两个参数的类型必须一致,
    但是 int和char类型不一致  所以报错
    */
    Test2(a, c);//对于普通函数而言,则可以进行隐式类型转换,所以没有问题
}

void ProtectB(){
    int a=1,b=2;
    char c = ‘3‘,d=‘4‘;
    Test1(a, b);//这里调用普通函数
    Test1<>(a, b);//这里调用模板函数--规则4
    Test1(c, d);//这里调用模板函数--规则3---假设没有模板函数  仍然会调用普通函数
    Test3(c, d);
}

void main(){
    ProtectB();
    system("pause");
}
时间: 2024-10-13 06:51:23

C++ 函数模板二(函数模板重载)的相关文章

python基础之====函数对象、函数嵌套、名称空间与作用域、装饰器

阅读目录 一 函数对象 二 函数嵌套 三 名称空间与作用域 四 闭包函数 五 装饰器 六 练习题 一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if def foo(): print('foo') def bar(): print('bar') dic={ 'foo':foo, 'bar':bar, } while True: choice=input(

【C++】模板简述(二):函数模板

我们上文讲了,模板的引入,我们发现在某种特殊的情况下,必须得通过模板才能完美的解决问题. 本文就来简述一下函数模板的基本使用. 一.函数模板格式 template<typename Param1, typename Param2,...,class Paramn> 返回值类型 函数名(参数列表){ ... } 二.函数模板的实例 //T表示类型,具体是什么不知道,实例化的时候才知道 //typename可以用class代替,但推荐使用typename //注意:typename不能用struc

C++ 类模板二(类模版与友元函数)

//类模版与友元函数 #include<iostream> using namespace std; template<typename T> class Complex{ public: Complex(T a,T b); void Print() const//const修饰的是this指针 { cout << this->Real << ":" <<this->Image<< endl; } /*

函数模板,函数模板重载,可变参数模板,函数模板覆盖,通过引用交换数据

 1.函数模板初级,如果想使用模板,需要实例化,实例化的方式是加上<数据类型> #include <iostream> //函数模板可以对类型进行优化重载,根据类型会覆盖 //如果仍然要使用模板函数,需要实例化 template<class T> T add(T a, T b) { std::cout << "T add " << std::endl; return a + b; } int add(int a, int

在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数

看视频教程说不能在c++ 模板类外写 操作符重载函数,并且是模板类的友元函数 我试了试,可以,放出测试代码: #include <iostream> using namespace std; template<typename T> class A { public: A(T a) { this->a = a; } template<typename T> //加上这句就可以了 friend A<T> operator+(A<T> &

C++学习之模板 ----函数模板、类模板

本博文主要讨论函数模板与类模板以及其简单应用. 1).作用:函数模板和类模板都可以看做是一种代码产生器,往里面放入具体的类型,得到具体化的函数或者class. 2).编译(分为两步): a):实例化之前,先检查模板本身语法是否正确: b):根据 函数调用或者类模板调用 ,先去实例化模板代码,产生具体的函数/类. 也就是说, 没有函数调用或者类类型对象声明,就不会实例化模板代码,在目标文件obj中找不到模板的痕迹. 3):优缺点 模板的缺点是代码膨胀,编译速度慢,而优点是运行速度快. 一.函数模板

模板(三) 函数模板

一.函数模板介绍 函数模板是一个生成函数的公式,可以用来生成针对特定类型的函数版本: 如:求两个具有相同的数据类型的数值中的最大值:普通的一个函数只能使用于某种特定类型,不能适用于其他数据类型,而使用函数模板则可以进行泛型编程, 对于使用该函数模板的各个数据类型在编译时期则会生成相应的适用于该数据类型的函数版本,这样就避免对于每一种数据类型编写相应的函数版本, 可以加快开发速度,减少不必要的重复代码. template<typename T> T Max(const T &lhs, c

C++--模板的概念和意义、深入理解函数模板、类模板的概念和意义

一.模板的概念与意义 Q:C++中有几种交换变量的方法?定义宏代码与定义函数A.定义宏代码优点:代码复用,适合所有的类型缺点:编译器不知道宏的存在,缺少类型检查B.定义函数优点:真正的函数调用,编译器对类型进行检查缺点:根据类型重复定义函数,无法代码复用 C.泛型编程--不考虑具体数据类型的编程方式Swap泛型写法中的T不是一个具体的数据类型,而是泛指任意的数据类型C++中的泛型编程函数模板--一种特殊的函数可用不同类型进行调用,看起来和普通函数很相似,区别是类型可被参数化函数模板的语法规则1.

C++模板学习:函数模板、结构体模板、类模板

C++模板:函数.结构体.类 模板实现 1.前言:(知道有模板这回事的童鞋请忽视) 普通函数.函数重载.模板函数 认识. //学过c的童鞋们一定都写过函数sum吧,当时是这样写的: int sum(int a,int b) { return a+b; } //实现了整数的相加 //如果再想同时实现小数的相加,就再多写个小数的相加.普通实现我就不写了,知道函数重载的童鞋们会这样写: int sum(int a,int b) {//第一个function return a+b;} double su