美文网首页
模板非类型形参的详细阐述

模板非类型形参的详细阐述

作者: caisense | 来源:发表于2018-01-19 15:57 被阅读0次

http://m.blog.csdn.net/u012999985/article/details/50780311

关于模板的非类型形参,网上有很多内容,C++primer只有大概一页的阐述,但是都不够清晰详细。下面我尽可能从自己的角度去给大家描述一下非类型形参的相关细节。如果想进一步理解非类型形参以及模板内容可以阅读C++template这本书,在4.1节,8.3.3节,13.2节都有相关解释。

模板除了定义类型参数,我们还可以在模板定义非类型参数。

什么是非类型形参?顾名思义,就是表示一个固定类型的常量而不是一个类型。

先举一个简单的例子(模板类与模板函数都可以用非类型形参)

//例子1:
template<class T, int MAXSIZE> 
class List {
  private:
    T elems[MAXSIZE];  
  public:
    Print() { 
      cout<<"The maxsize of list is"<<MAXSIZE; 
    }
}
List<int,5> list;
list.Print(); //打印"The maxsize of list is 5"

这个固定类型是有局限的,只有整形,指针和引用才能作为非类型形参,而且绑定到该形参的实参必须是常量表达式,即编译期就能确认结果。

这里要强调一点,我们对于非类型形参的限定要分两个方面看

1.对模板形参的限定,即template<>里面的参数

2.对模板实参的限定,即实例化时<>里面的参数

下面逐个解释一下非类型形参的局限

1.浮点数不可以作为非类型形参,包括float,double。具体原因可能是历史因素,也许未来C++会支持浮点数。

2.类不可以作为非类型形参。

3.字符串不可以作为非类型形参

4.整形,可转化为整形的类型都可以作为形参,比如int,char,long,unsigned,bool,short(enum声明的内部数据可以作为实参传递给int,但是一般不能当形参)

5.指向对象或函数的指针与引用(左值引用)可以作为形参

下面解释一下非类型实参的局限

1.实参必须是编译时常量表达式,不能使用非const的局部变量,局部对象地址及动态对象

2.非Const的全局指针,全局对象,全局变量(下面可能有个特例)都不是常量表达式。

3.由于形参的已经做了限定,字符串,浮点型即使是常量表达式也不可以作为非类型实参

备注:常量表达式基本上是字面值以及const修饰的变量

相关文章

  • 模板非类型形参的详细阐述

    http://m.blog.csdn.net/u012999985/article/details/5078031...

  • template 模板

    两种通式:函数模板通式,类模板通式 一、函数模板通式 二、类模板通式 三种类型的模板形参:类型形参,非类型形参和模...

  • (二十九)C++篇-template(二)

    同一模板的声明和定义中,模板形参的名字不必相同。 每个模板类型形参前面必须带上关键字 class 或 typena...

  • C++11 模板元编程 - 模板的编译期计算

    和函数求值类似,当模板的形参被实参替换时,模板会进行编译期计算。由于模板的参数支持类型参数和非类型参数,所以模板在...

  • Swift-函数基础

    一、函数 1、定义 1、声明:func 函数名(形参名:形参类型,形参名:形参类型)-> 返回值类型 2、调用:函...

  • swift

    swift 函数 一、函数的定义函数的定义格式 形参列表的格式形参名1: 形参类型1, 形参名2: 形参类型2, ...

  • STL与泛型编程(geekband)

    1.定义模板 1.1函数模板template<模板参数列表>返回值 函数名(形参列表) 实例化函数模板通过形参列表...

  • swift函数基础知识

    1、函数声明和调用 通用函数声明格式:func 函数名称(形参名:形参类型,形参名:形参类型,···)->返回值类...

  • 函数模板和类模板--GeekBand

    一 函数模板函数模板,实际上是建立一个通用函数,其返回值类型和形参类型不具体指定,用一个虚拟的类型来代替。这个通用...

  • Function template

    函数模板 函数模板,实质上建立一个通用函数,其函数类型和形参不具体指定,用一个虚拟的类型来代表。这个通用函数就称为...

网友评论

      本文标题:模板非类型形参的详细阐述

      本文链接:https://www.haomeiwen.com/subject/iqogoxtx.html