标签:
一、类型转换与模板类型参数
模板与函数调用一样,使用传递给模板的实参来初始化模板的形参,只是这个参数是模板参数,且通常是类型参数,在模板编程中,需要有一个很重要的思维转换:非模板编程中,处理的通常是变量,变量的类型是变量的属性,而在模板编程中,处理的更多的是类型本身,我们可以将类型本身作为参数来传递,可以根据实参的类型,推断类型参数的值(注意这个值指的就是‘类型’),比如
template <typename T> void fun(const T& param) ...
我们处理的更多的是类型参数T,而非param。
由于模板的特殊性,通常不会对参数进行转换,而是直接生成一个新的模板,但是也是有例外的,模板类型转换原则有以下几条:
1) 顶层const,不论在实参还是形参中,都会被忽略,即对于模板
template <typename T> void func(T i, T ii) { intTraits<T>::isInt(); intTraits<typename add_const<T>::type>::isInt(); } int i = 0; const int ci = 1;
不管是func(i, ci) 还是func(ci, ci)推断出来的T都是int,而不是const int。
即类型实参传入模板时,实参以及形参的顶层const都直接去掉忽略不计,只不过形参的顶层const在模板里边还需要控制形参不能被改变,所以仅仅是在参数传入时被忽略。
2)const转换,可以将一个非const对象的引用(或指针)传递给一个const的引用(或指针)形参,比如下面的代码就不会报错,并且三次调用,T都被推断成string类型那个
template<typename T> void func(const T&, const T&) { } int main() { string x= "x"; const string cx = "ss"; func(x, cx); func(cx, cx); func(x, x); return 0; }
3)数组或函数指针转换:如果函数形参不是引用类型,则可以对数组或函数类型实参进行正常的指针转换。但是如果是引用类型,则不会转换为指针
标签:
原文地址:http://www.cnblogs.com/64open/p/4781520.html