模板(二) 模板语法

一、模板参数列表

模板参数列表是一个逗号分隔的一个或者多个模板参数的列表;

template<typename T, typename U>

如上所示,typename T和typename U为模板参数;

二、模板参数

模板参数分为模板类型参数非类型模板参数两种;

1)模板类型参数:模板类型参数可以看做类型说明符,可以向类类型说明符和内置类型一样使用;

2)非类型模板参数:非类型模板参数可以是一个整型,或者一个指向对象或者函数类型的指针或引用;非类型模板参数用来表示一个值,

需要通过一个特定的类型名(如int等类型)来指定一个非类型模板参数;非类型模板参数可以通过用户提供的或者编译器推断的值替代,但是用来替代该非

类型模板参数的值必须为常量表达式(即在编译时期就能确定的值),绑定到指针或引用的非类型模板参数的实参需要具有静态生存期;指针参数可以使用

nullptr或者值为0的常量表达式来实例化;

template<typename T, unsigned N>
void Move(const T (&source)[N], const T (&dest)[N])
{
    for (int i = 0; i < N; ++i)
        dest[i] = source[i];
}

如上所示,该模板使用模板类型参数T和非模板类型参数N来拷贝某种类型的长度为N的数组;

三、模板参数与作用域

在模板参数列表中定义的模板参数名的可用范围同函数参数列表中定义的参数名一样,其可用范围为其声明之后,到模板声明或定义结束之前;

同样的,在模板作用域中不能重用模板参数名;

四、模板的声明

与函数声明相同,模板声明需要包含模板参数,就如函数声明需要包含参数类型与数目;

template <typename T, unsigned N> void Move(const T(&source)[N], const T(&dest)[N]);

五、模板默认实参

如同可以为函数提供默认实参,在类模板或者函数模板中可以提供模板默认实参

template<typename T = int, unsigned N = 1>
class Array
{
    T num_[N];
};

int main()
{
    Array<> test1;
    Array<double> test2;
    Array<double, 5> test3;

    return 0;
}

在使用类模板时,无论何时都需要在模板名后提供<>,表示该类从一个模板类实例化而来;所以,当所有的参数为默认模板参数时,仍然需要在模板名后接<>;

六、模板控制实例化

在存在多个对象文件时,如果在多个对象文件中对于同一个模板使用了相同的模板参数时,在这些对象文件中都会生成一个相同的模板实例;

这样会使编译速度变慢,增加不必要的开销,为了减少这样的开销,可以使用显式实例化显式实例化一个模板,得到一个模板实例;

C++提供实例化声明实例化定义来实现显式实例化,实例化声明表示在其他对象文件中已经存在该模板的一个实例;实例化定义则在该对象文件

中显式实例化该模板的一个实例;

extern template class Array<double, 5>;  // 显式实例化声明
template class Array<int, 10>;           // 显式实例化定义

在普通情况下,当编译器在编译时检测到程序使用了类模板的成员时才会生成该模板实例中的成员;但是使用显示实例化时,显式实例化类模板会实例化所有的成员,

因为编译器遇到显示实例化声明时就会实例化一个实例,这时无法得知在程序中成员的使用情况;

七、模板编译

1)模板实例化时机:当编译器遇到模板定义时不会实例化模板,当遇到一个模板的使用时,才会生成代码实例化该模板;

2)模板成员定义位置:当实例化一个模板时,编译器需要模板的所有成员信息,模板以及其成员的的定义必须是可见的,所以模板成员的声明与定义需要在同一个文件中;

3)头文件与模板:在模板中存在两种类型名,一种为模板参数列表中出现的模板类型参数,一种为普通的内置类型或者类类型;如同普通类定义一样,类类型需要

在模板定义的位置是可见的;

时间: 2024-10-27 04:43:00

模板(二) 模板语法的相关文章

thinkPHP 模板中的语法知识 详细介绍(十二)

本章节:介绍模板中的语法,详细的语法介绍 一.导入CSS和JS文件    ==>记住常量的是大写 1.css link .js  scr <link rel='stylesheet' type='text/css' href='__PUBLIC__/Css/test.css'/> <script src='__PUBLIC__/Js/test.js'></script> 2.import(==默认是在Public文件夹下) //导入Public文件夹下面的Js目录

flask之二 模板相关

flask之二 模板相关 预热 在渲染模板的时候,默认会从项目根路径下的templates目录下查找模板 如果想要指定模板路径的时候,就在初始化APP的时候,这样操作即可: app = Flask(__name__,template_folder='C:/templates') #template_folder可以指定模板位置 模板传参 在使用render_template渲染模板的时候,可以传递关键字参数,以后直接在模板中使用就可以了 如果参数过多的话,那么就可以将所有的参数放到一个字典中,然

Django项目实践2 - Django模板(常用语法规则)

http://blog.csdn.net/pipisorry/article/details/45727309 模板中常用的语法规则 {最新版本的Django语法可能有改变,不支持的操作可能支持了.[HTML教程 - 基本元素/标签及属性]} Django 模板标签 if/else 标签 1. 基本语法格式如下: {% if condition %} ... display {% endif %} 或者: {% if condition1 %} ... display 1 {% elif con

c++模板的一些语法

函数模板的特化 template <class T> int compare(T v1,T v2) { if(v1<v2) return -1; else if(v1>v2) return 1; else return 0; } template <> int compare<char *>(char * s1,char * s2) { return strcmp(s1,s2); } 类模板的特化 template <class T> class

Flask 的 template模板 与 jinja2语法

Flask 的 template模板 与 jinja2语法 Flask使用的是Jinja2模板,所以其语法和Django基本无差别 1.模板基本数据的渲染 变量 {{..}} 列表 {% for item in List %}<li>{{item}}</li>{% endfor %} 字典 {% for k,v in Dict.items() %}<li>{{k}}{{v}}</li>{% endfor %} 2 注意:Markup等价django的mark

python MVC、MTV 框架介绍 Django 模板系统常用语法

Django 框架简介一.MVC框架和MTV框架1.MVC 全名Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分.优势: 耦合性低 重用性高 生命周期成本低结构:模型(Model) 与数据库相关 存取数据视图(View) 处理业务逻辑 展示信息控制器(Controller) 获取用户信息 给模型传递指令2.Django的MTV 全名Model Template View 借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性.结构

Flask学习之二——模板

1.Jinja2模板引擎 模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道.使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染. 默认情况下,Flask 在程序文件夹中的 templates 子文件夹中寻找模板.Flask 提供的 render_template 函数把 Jinja2 模板引擎集成到了程序中.render_template 函数的第一个参数是模板的文件名.随后的参数都是键值对,表示模板中变量对应的真实值. -*- u

忍不住吐槽类模板、模板类、函数模板、模板函数

最近在查资料,发现了一些blog上写"类模板.模板类.函数模板.模板函数的区别"之类的文章.一看之下,闭起眼睛想想,自己写了这么久C++,知道模板,知道函数,也知道类.如果单独问我,类模板或者模板类,我都认为是采用了模板的类.但不知道这"类模板.模板类.函数模板.模板函数"是什么东西. 仔细看了下文章,忍不住吐槽了.其实就是采用模板的类叫类模板,实例化后叫模板类.采用模板的函数叫函数模板,实例化后叫模板函数.好吧,你赢了.知道模板的都会知道,模板实例化后会由编译器生

js-template-art【二】语法

一.模板语法 1.变量使用与输出 <% if (user) { %> <h2><%= user.name %></h2> <% } %> 或: {{if user}} <h2>{{user.name}}</h2> {{/if}} art-template 同时支持 {{expression}} 简约语法与任意 JavaScript 表达式 <% expression %>. 2.原始输出 {{@value}}