#include
using namespace std;
int max_int(int x, int y) {
return x > y ? x : y;
}
double max_double(double x, double y) {
return x > y ? x : y;
}
string max_string(string x, string y) {
return x > y ? x : y;
}
int main()
{
int nx = 10, ny = 10;
cout << max_int(nx, ny) << endl;
double dx = 12.3, dy = 45.6;
cout << max_double(dx, dy) << endl;
string sx = "world", sy = "hello";
cout << max_string(sx, sy) << endl;
return 0;
}
#include
using namespace std;
#define Max(x, y) (x > y ? x : y)
int main()
{
int nx = 10, ny = 10;
cout << Max(nx, ny) << endl; //(nx>ny?nx:ny)
double dx = 12.3, dy = 45.6;
cout << Max(dx, dy) << endl; //(dx>dy?dx:dy)
string sx = "world", sy = "hello";
cout << Max(sx, sy) << endl; //(sx>sy?sx:sy)
char cx[256] = "world", cy[256] = "hello";
cout << Max(cx, cy) << endl; //类型不安全 (cx>cy?cx:cy)
return 0;
}
#include
using namespace std;
#define MAX(T) T max_##T(T x, T y){\
return x > y ? x : y;\
}
MAX(int) //int max_int(int x, int y) {return x > y ? x : y;}
MAX(double) //double max_double(double x, double y) {return x > y ? x : y;}
MAX(string) //int max_string(string x, string y) {return x > y ? x : y;}
#define Max(T) max_##T
int main()
{
int nx = 10, ny = 10;
cout << Max(int)(nx, ny) << endl; //max_int(nx, ny);
double dx = 12.3, dy = 45.6;
cout << Max(double)(dx, dy) << endl; //max_double(dx, dy);
string sx = "world", sy = "hello";
cout << Max(string)(sx, sy) << endl; //max_string(sx, sy);
char cx[256] = "world", cy[256] = "hello";
cout << Max(string)(cx, cy) << endl; //max_string(cx, cy);
return 0;
}
函数模板的定义形式:
template
返回值类型 函数模板名(调用形参1, 调用形参2, …)
{
…
}
例如:
template<class T>
T Max(T x, T y)
{
return x > y ? x : y;
}
可以使用任何标识符作为类型形参的名称,但使用 “T” 已经成为一种惯例,“T” 表示的是,调用者在使用这个函数模板时指定的任意数据类型。
例如:Max Max Max
#include
using namespace std;
//函数模板
template<class T>
T Max(T x, T y)
{
return x > y ? x : y;
}
int main()
{
int nx = 10, ny = 10;
cout << Max<int>(nx, ny) << endl;
double dx = 12.3, dy = 45.6;
cout << Max<double>(dx, dy) << endl;
string sx = "world", sy = "hello";
cout << Max<string>(sx, sy) << endl;
char cx[256] = "world", cy[256] = "hello";
cout << Max<string>(cx, cy) << endl;
return 0;
}
例如:一个不支持 “>” 操作符的类型来实例化Max函数模板,编译器将报错误。
如果函数模板的调用形参和类型形参相关。
例如:template
那么在实例化函数模板时即使不显示指明函数模板的类型实参,编译器也有能力根据调用实参的类型隐式推断出正确的类型实参的类型。
例如:Max(123, 456); => Max
获得和调用普通函数一致的语法表现形式。
三种情况不能做隐式推断
调用参数 和 类型参数 不完全相关
例如:template
隐式推断不支持隐式类型转换
例如:template
使用时:Max(123, 45.6);
返回值类型不支持隐式推断。
普通函数和可实例化出该函数的函数模板构成重载关系。
在数据类型匹配度相同情况下编译器有限选择普通函数。
除非函数模板可以产生具有更好的数据类型匹配度的实例。
函数模板的实例化不支持隐式类型转换但普通函数支持。
在传递参数时如果需要编译器做隐式类型转换,则编译器选择普通函数。
可以在实例化时用 <> 强行通知编译器选择函数模板。