码迷,mamicode.com
首页 > 编程语言 > 详细

c++模板技术:模板的类型转换与参数推断

时间:2015-09-04 12:33:00      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:

一、类型转换与模板类型参数

模板与函数调用一样,使用传递给模板的实参来初始化模板的形参,只是这个参数是模板参数,且通常是类型参数,在模板编程中,需要有一个很重要的思维转换:非模板编程中,处理的通常是变量,变量的类型是变量的属性,而在模板编程中,处理的更多的是类型本身,我们可以将类型本身作为参数来传递,可以根据实参的类型,推断类型参数的值(注意这个值指的就是‘类型’),比如

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)数组或函数指针转换:如果函数形参不是引用类型,则可以对数组或函数类型实参进行正常的指针转换。但是如果是引用类型,则不会转换为指针


c++模板技术:模板的类型转换与参数推断

标签:

原文地址:http://www.cnblogs.com/64open/p/4781520.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!