模板函数的默认模板参数

模板函数的使用

template<typename T> void TempFun(T a)
{
	cout << a << endl;
}

int main()
{	
	TempFun(1);    //实例化为TempFun<const int>(1)
	TempFun("1");  //实例化为TempFun<const char *>(1)
}

        在编译器解析到函数调用TempFun (1)的时候,发现fun是一个函数模板,这时候编译器就会根据实参1的类型const int推导实例化模板函数void TempFun<cons tint>(int),再进行调用,相应的,对于TempFun (“1”)类似,实例化模板函数的参数类型将是const char*。

模板函数的默认模板参数

       函数模板在C++98中与类模板一起被引入,不过在模板类声明的时候,标准允许其有默认模板参数,而模板函数直到C++11才支持,不过类模板默认参数,必须遵照“从右到左”的规则进行指定,而这个条件对函数模板并不是必须的

template<typename T1, typename T2 = int> class AClass;          //类模板-编译正常
template<typename T1, typename T2 = int> void AFun(T1 a, T2 b); //函数模板-编译正常
template<typename T1 = int, typename T2> class BClass;          //类模板-无法通过
template<typename T1 = int, typename T2> void BFun(T1 a, T2 b); //函数模板-正常编译

        函数模板的参数推导规则并不复杂,简单地讲,如果能从函数实参中推导出类型的话,那么默认模板参数就不会被使用,反之,默认模板参数可能被使用。如下例:

template<typename T1, typename T2 = double> 
void Foo(T1 t = 0, T2 b = 0) {};

int main()
{	
	Foo(1, 'c');        //Foo<int, char>(1,'c')
	Foo(1);             //Foo<int, double>(1,0),使用了默认模板参数double
	Foo();              //错误
	Foo<int>();         //Foo<int, double>(0,0),使用了默认模板参数double
	Foo<int, char>();   //Foo<int, char>(0,0)
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值