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

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

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

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


时间: 2024-12-22 23:54:18

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

合并_08smarty模板技术(3days)

2013-12-9 昨天内容回顾 两个常用方法assign()和display() assign方法给模板传递变量信息(实际是把信息给到smarty对象属性里边) append方法给模板传递变量信息,和assign的区别是以数组形式传递给模板,可以使用名字一样的变量信息 display()方法展示模板, 后缀.html. 一般实际在使用的时候,模板的后缀习惯是 .tpl,这样别人就不会直接过来访问. 模板中3种变量使用 assign给模板传递的变量使用 系统保留变量 get post sessi

模板系列(一) 模板的模板参数

前面我们写过类似的Stack: template <typename T, typename Alloc = std::vector<T> > class Stack { public: void push(const T &); void pop(); T top() const; bool empty() const; private: Alloc _cont; }; 那么我们使用的时候需要这样: Stack<string, list<string>

FormView的插入模板中的DropDownList控件参数

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DT

velocity模板技术生成word文档

本文介绍采用velocity技术在Java中生成word文档的方法. 1.新建一个word文档,编辑内容如下: 2.将上述word文档另存为htm格式的文件 3.新建一个Java Project项目velocityTest,加入Velocity所依赖的Jar包velocity-dep-1.5-beta2.jar. 4.在src目录下新建一个velocity.vm文件,将第二步生成的velocity.htm用文本编辑器打开,复制内容到velocity.vm中.内容如下: <html xmlns:v

DataUml Design 教程5-代码模板介绍(甚于T4模板技术)

DataUml Design 代码模板完全基于C#语言来编写的.不懂写模板的可以请教作者,随时欢迎.下面是一段模板代码,这段代码可以获取一个类结构的所有信息. <#@ template language="C#" HostSpecific="True" #> <# NetUmlTemplateCodeHost host = (NetUmlTemplateCodeHost)(Host); #> 命名空间:<#= host.ClassPro

模板系列(一)模板的模板参数

在之前,我们写过类似的stack template <typename T, typename Alloc = std::vector<T> > class Stack { public: void push(const T &); void pop(); T top() const; bool empty() const; private: Alloc cont_; }; 那么我们使用的时候,需要这样写 Stack<string, list<string>

[C++] 利用模板的模板参数实现单链表

模板的模板顾名思义就是一个模板函数的参数是另一个模板函数的模板. 模板函数有兴趣的读者请看我上一篇博客模板函数,实现顺序表, 请看模板的模板简要举例 上边两张图片就是模板的模板类型了,模板的模板也可以使用缺省参数(这一点与函数相似) 好了上面介绍过了,现在直接上代码吧,我个人觉得一个函数怎么用,还是直接看实例更容易让人懂, 下面是单链表的节点类, 用的是模板函数 #pragma once #include<iostream> using namespace std; #include<s

模板的模板参数使用示例

注意:函数模板不支持模板的模板参数. Stack7.h中定义的Stack: #ifndef STACK7_H #define STACK7_H #include <deque> #include <stdexcept> #include <memory> template <typename T, template <typename ELEM, typename = std::allocator<ELEM> > class CONT =

JAVA模板技术

一.起源与现状: 关于Template和JSP的起源还要追述到Web开发的远古年代,那个时候的人们用CGI来开发web应用,在一个CGI程序中写HTML标签. 在这之后世界开始朝不同的方向发展:sun公司提供了类似于CGI的servlet解决方案,但是无论是CGI还是servlet都面对同一个问题:在程序里写html标签,无论如何都不是一个明智的解决方案.于是sun公司于1999年推出了JSP技术.而在另一个世界里,以PHP和ASP为代表的scriptlet页面脚本技术开始广泛应用. 不过即便如