模板!终于到这里了!C++的精髓!
1.函数模板:
// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
template <typename T>
void compare(const T &v1, const T &v2)
{
if (v1 > v2)
cout<<"v1 > v2"<<endl;
else if (v1 == v2)
cout<<"v1 = v2"<<endl;
else
cout<<"v1 < v2"<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
compare(1,2);
compare(1.2,1.1);
getchar();
return 0;
}
模板极大的方便了我们编程,如果使用函数重载,写N多种重载,这里只要写一次就可以了。当我们使用函数时,编译器会根据我们给的参数,实例化一个函数,供我们调用(这个过程发生在编译时),编译器产生的版本通常被成为模板的实例。
定义模板时,模板有一个模板类型参数,该参数可以在模板函数中使用,即一种类型说明符,用于返回值类型或者参数类型等。
模板的错误在创建时只能判断一些拼写的错误,真正的错误只有在实例化时才能被检查出来。
当我们给模板传递参数时,要明确模板中的操作改类型的参数是否支持,这一点是调用者应该注意的。(比如我们使用一个进行“+”操作的模板,但是该类型没有对"+"的运算符操作,实例化时会发生错误)
注:函数模板的定义和声明通常都放在头文件中
模板重载:
1.当同样的函数,有一个非模板的重载时,会调用非模板的版本。
2.如果没有直接可调用的函数,而有函数模板,会实例化这些模板中最特例化的一个版本。
3.如果都没有,出错!