栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

C++模板编程(10)---更深入的基础技术:模板参数(Template Parameter)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++模板编程(10)---更深入的基础技术:模板参数(Template Parameter)

Template parameters有三种类型:

  • 类型参数Type parameters
  • 非类型参数 Non-type Parameters
  • 双重模板参数 Template Template Parameters

所谓模板参数template parameters是在模板声明语句的参数化子句(parameterized clause)中声明的变量。Template parameters不一定要署名:

template   // 这里,两个模板参数都没有名称

class X;

但是当template程序中需要用到某个template parameter时,后者就必须署名。另外,后面声明的template parameters可以用到先声明的template parameters的名称,反之不然:

template

                T* Root,

                template class Buf > //Buf, 就是template template parameter

class Struture;

1. 类型参数Type Parameters

Type parameters可以采用关键词typename 或关键词class导入,两者等价。其声明形式是:关键词typename 或class后面跟一个简单标识符,该符号后面可跟一个逗号以便区隔下一个参数,也可以使用闭锁角括号结束参数子句,或跟一个等号=标识出预设模板自变量default template argument。

在template 声明语句中type parameter的作用非常类似typedef的名称。例如不能使用如class T这样的完整名称,即使T确实表示一个class type:

template

class List {

        class Allocator* allocator;//Error

        friend class Allocator; //Error     

        ...    

};

2. 非类型参数NonType Parameters

Nontype template parameter是指那些可在编译期或链接期确定其值的常数。此种参数的类型必须是以下三者之一:

  • 整数integral或列举enumeration类型
  • pointer类型:包括指向常规objects、指向functions和指向members
  • referenc类型:包括指向objects或指向functions。

令人惊讶的是,nontype parameter的声明在某种情况下也以关键词typename为前缀词

template

                typename T::Allocator* Allocator>            //nontype parameter

class List;

Nontype parameters 也可以是functions类型或array类型,但它们都会退化为对应的pointer类型:

template class Lexer;

template class Lexer;

Nontype template parameters的声明类似变量声明,但不能加上static、mutable之类的修饰。你可以加上const或volatile,但如果修饰词出现在参数类型的最外层,编译器会忽略它们:

template  class Buffer;

template class Buffer; //与上一行等价

最后一点,nontype parameters总是右值rvalues:它们不能被取值,也不能被赋值,

3. 双重模板参数Template Template Parameter 

template template parameters是一种class template占位符,其声明方式和class template类似,只是不能使用关键词struct和union:

template