上次我们讲了模板参数自动推导,模板参数自动推导可以让我们调用模板函数和调用普通函数一样方便,但是,如果模板参数列表中存在不能进行自动推导的参数,那么,当我们调用这个模板函数的时候,还需要为它们指定实际的模板参数;那么是否有一种方法,可以帮助我们彻底实现调用模板函数和调用普通函数一样简单呢?答案是有的,那就是:模板参数自动推导+模板参数默认值。今天我们就来看一下什么是模板参数默认值。
模板参数默认值的主要目的就是为那些不能进行自动推导的模板参数赋予一个默认值,使用方法就是直接在模板参数后边通过等号为其赋值;这样,我们调用这个模板函数就可以不用再为任何模板参数赋值。下面,我们看一个例子,这个例子演示了使用模板默认值的好处。需要注意的是,模板参数默认值需要C++11的支持,我的机器使用的是vc2013和gcc 4.81,这两个版本的编译器都支持C++11的特性。在gcc 4.81的编译器中,编译命令如下:
g++ -o 文件名 源文件名列表 -std=c++11
例1 使用模板参数默认值的好处
#include<iostream> using namespace std; template<typename T0=float, typename T1,typename T2=int, typename T3, typename T4> T2 func(T1 v1, T3 v3, T4 v4) { return (T2)0; } int main() { int n = func(1, 2, 3); cout<<n<<endl; return 0; }运行效果如图1:
图1 使用模板参数默认值的好处
在例1中,由于模板参数T0和T2不能自动推导,所以,在调用这个模板函数的时候,一定要指定,又因为T1和T3被T2分隔,所以导致T1也要被指定实际的模板参数,因此如果不使用模板参数默认值的机制,调用这个模板函数的方法如下:
int n = func<float,int,int>(1, 2, 3);因此,通过对比两种模板函数的调用方式,我们会发现使用模板参数默认值的方便。
今天,我们主要讲了什么是模板参数默认值以及它的好处。希望大家多多练习,在实践中体悟它的用法和方便。