C++ 函数模板
2016-03-30 19:18
369 查看
01_函数模板定义.cpp
02_函数模板使用实际类型.cpp
03_函数模板的重载.cpp
04_函数模板的重载发生歧义.cpp
05_函数模板的特例化.cpp
#include<iostream> #include <typeinfo> using namespace std; #if 0 int MAX(int a,int b) { cout<<__func__<<"int,int"<<endl; return a>b?a:b; } char MAX(char a,char b) { cout<<__func__<<"char,char"<<endl; return a>b?a:b; } double MAX(double a,double b) { cout<<__func__<<"char,char"<<endl; return a>b?a:b; } #endif //#define MAX(type1 a, type1 b) //template <class T> template <typename T> T MAX(T a, T b) { cout<<__func__<<typeid(T).name()<<endl; return a>b?a:b; } int main() { cout<<MAX(10,9)<<endl; cout<<MAX('a','a')<<endl; cout<<MAX(10.1,9.1)<<endl; }
02_函数模板使用实际类型.cpp
#include<iostream> #include<string.h> using namespace std; template<unsigned M, unsigned N> bool compare(char (& a)[M], char(&b) ) { return strcmp(a,b); } int main() { char s1[]="1234567890"; char s2[]="1234567890"; cout<<compare(s1,s2)<<endl; }
03_函数模板的重载.cpp
#include<iostream> #include <typeinfo> using namespace std; //函数模板的重载,匹配规则: //1,对于一个函数调用,其候选函数包括所有的函数模板实参推断成功而导出的函数实例; //2,模板和非模板都是按类型顺序来转换; //3,如果有一个函数提高的比其他函数都好的匹配,那么选择此函数: //A:如果同样好的函数只有一个是非模板的函数,则选择此函数; //B:如果同样好的函数中没有非模板函数,而有多个模板函数,且其中一个模板比其他模板更特例化,则选择此模板; //C:否则,此函数调用发生歧义! template <typename T> T MAX(T a, T b) { cout<<__func__<<typeid(T).name()<<endl; return a>b?a:b; } template<> int MAX(int a,int b) { cout<<__func__<<" int"<<endl; return a>b?a:b; } int main() { cout<<MAX(10,9)<<endl; cout<<MAX('a','a')<<endl; cout<<MAX(10.1,9.1)<<endl; // cout<<MAX(1,2,3)<<endl; }
04_函数模板的重载发生歧义.cpp
#include<iostream> #include <typeinfo> using namespace std; //函数模板的重载,匹配规则: //1,对于一个函数调用,其候选函数包括所有的函数模板实参推断成功而导出的函数实例; //2,模板和非模板都是按类型顺序来转换; //3,如果有一个函数提高的比其他函数都好的匹配,那么选择此函数: //A:如果同样好的函数只有一个是非模板的函数,则选择此函数; //B:如果同样好的函数中没有非模板函数,而有多个模板函数,且其中一个模板比其他模板更特例化,则选择此模板; //C:否则,此函数调用发生歧义! template <typename T> T MAX(T a, T b) { cout<<__func__<<typeid(T).name()<<endl; return a>b?a:b; } template<class M> M MAX(M a,M b) { cout<<__func__<<" int"<<endl; // return (a>b?a:b)>c?(a>b?a:b):c; return a>b?a:b; } int main() { cout<<MAX(10,9)<<endl; cout<<MAX('a','a')<<endl; cout<<MAX(10.1,9.1)<<endl; // cout<<MAX(1,2,3)<<endl; }
05_函数模板的特例化.cpp
#include<iostream> #include <typeinfo> using namespace std; //函数模板的重载,匹配规则: //1,对于一个函数调用,其候选函数包括所有的函数模板实参推断成功而导出的函数实例; //2,模板和非模板都是按类型顺序来转换; //3,如果有一个函数提高的比其他函数都好的匹配,那么选择此函数: //A:如果同样好的函数只有一个是非模板的函数,则选择此函数; //B:如果同样好的函数中没有非模板函数,而有多个模板函数,且其中一个模板比其他模板更特例化,则选择此模板; //C:否则,此函数调用发生歧义! template <typename T> T MAX(T a, T b) { cout<<__func__<<typeid(T).name()<<endl; return a>b?a:b; } //int MAX(int a,int b, int c) int MAX(int a,int b) { cout<<__func__<<" int"<<endl; // return (a>b?a:b)>c?(a>b?a:b):c; return a>b?a:b; } int main() { cout<<MAX(10,9)<<endl; cout<<MAX('a','a')<<endl; cout<<MAX(10.1,9.1)<<endl; // cout<<MAX(1,2,3)<<endl; }
相关文章推荐
- C++ 多继承
- 《C++ primer 第九章-函数重载》读书笔记
- [C++] const int *a, int const *a,int * const a,区别,指针数组
- IOS学习之—— Quartz 2D (C语言的框架)
- C++输入
- c++ 单继承
- C++ eof
- c++作业2
- C++走向远洋——23(项目一,三角形,类)
- C++走向远洋——22(项目一,三角形,类)
- C++走向远洋——21(项目一,三角形,类)
- C++第1次实验
- C++走向远洋——20(项目一,三角形,类)
- c++实验2
- 如何用python的装饰器定义一个像C++一样的强类型函数
- 基于C++的sprintf函数使用技巧
- C++ primer 练习9.49
- c++第三次上机作业
- Gray码的递归与非递归C++实现
- C++内存机制