`

C++ 模板参数

阅读更多

实际上有三种类型模板参数:类型模板参数、无类型模板参数和模板模板参数(以模板作为模板的参数)。
1、类型模板参数
类型模板参数是我们使用模板的主要目的。我们可以定义多个类型模板参数:
template<typename T,typename Container>
class Grid
{...}
同样,也可以为类型模板参数指定默认值:
#include <iostream>
using std::vector;
template<typename T,typename Contianer=vector<T> >  //注意空格
class Grid
{...}
2、模板模板参数(template template parameter)
就是将一个模板作为另一个模板的参数。
正如上面的一个例子:
Grid<int,vector<int> > myIntGrid;
注意其中int出现了两次,必须指定Grid和vector的元素类型都是int。
如果写成:
Grid<int,vector> myIntGrid;
因为vector本身就是一个模板,而不是一个类型,所以这就是一个模板模板参数。指定模板模板参数有点像在常规的函数中指定函数指针参数。
函数指针类型包括返回类型和函数的参数类型。在声明模板模板参数的时候也要包括完整的模板声明:
首先要知道作为参数的模板的原型,比如vector
template<typename E,typename Allocator=allocator<E> >
class vector
{...};
然后就可以定义:
template<typename T,template<typename E,typename Allocator=allocator<E> >class Container=vector>
class Grid
{
public:
 //Omitted for brevity
 Container<T>* mCells;
};
模板模板参数的一般语法:
template<other params,...,template<TemplateTypeParams> class ParameterName,other params,...>
举例一个应用,Grid的一个构造函数:
template<typename T,template<typename E,typename Allocator=allocator<E> >class Container>
Grid<T,Container>::Grid(int inWidth,int inHeight):
mWidth(inWidth),mHeight(inHeight)
{
mCells=new Container<T> [mWidth];   //注意此处Container<T>说明,实际上还是说明 Grid<int,vector<int> >
for(int i=0;i<mWidth;++i)
  mCells[i].resize(mHeight);
}
使用的时候,与一般的没有什么区别:
Grid<int,vector> myGrid;
myGrid.getElement(2,3);
注意:不要拘泥于它的语法实现,只要记住可以使用模板作为模板的一个参数。
3、无类型模板参数
无类型模板参数不能是对象,甚至不能是double或者float。无类型参数仅限于int、enmu、指针和引用。
有时可能想要允许用户指定一个特定值的元素来初始化空对象,可以使用以下的方法:
template<typename T,const T EMPTY>
class Grid
{
public:
  //Omitted for brevity
  Grid(const Grid<T,EMPTY>& src);
  Grid<T,EMPTY>& operator=( const Grid<T,EMPTY>& rhs);
  //...
};
我们可以这样使用:
Grid<int,10> myIntGrid;
Grid<int,20> myIntGrid2;
初始值可以是任意的int数,也就是必须是int、enmu、指针和引用的一种。
4、指针和引用模板参数
指针和引用模板参数必须指向所有翻译单元中都可用的全局变量。对于这些类型的变量,相应的技术术语就是带有外部连接的数据。
使用extern声明即可。
如:
template<typename T ,const T& EMPTY>
class Grid
{...};
extern const int emptyInt=0;
Grid<int,emptyInt> myIntGrid;
对于初始化我们还可以使用“零初始化”即 T().

分享到:
评论

相关推荐

    C++参数传递与作用域

    函数进行参数传递,是在栈空间里为形参分配空间,并将计算各个实参的表达式的值,然后一一拷贝给形参的过程。 根据函数的参数传递的不同,函数调用可以分为函数的值传递调用(传值调用)、函数的指针传递调用(传址...

    C++之模板和可变模板参数

    C++之模板和可变模板参数

    浅谈C++模板实现模块间参数传递及回调

    一篇关于C++模板 设计模式 软件架构的文档,里面实现了一个泛化的命令模式和观察者模式

    c++函数模板

    其中,template为关键字,表示定义一个模板(可以是函数模板或类模板),尖括号表示模板参数,模板类型参数使用关键字class或typename开始,其后是一个用户定义的合法的标识符。 如果用户在调用函数模板时显式标识...

    适用于参数传递和回调的C++模板类

    自己的写类,感觉应该可以在大部分项目中通用

    C++标准模板库(The C++ Standard Templete Libray)

    标准C++模板库,编程高手必须熟练掌握的技术。

    C++11 模板参数的“右值引用”是转发引用吗

    主要介绍了C++11 模板参数的“右值引用”是转发引用吗,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    C++多态模板

    函数的重载:根据函数调用时所给的参数类型和数量不一样,在程序运行前就知道应该调用哪一个函数。 运算符的重载:根据运算对象的不同在编译时就可以确定执行什么样的结果

    利用C++模板的C到Lua简易封装库

    自己完成的,简易的C到Lua简易封装库,取名LuaMe,利用了C++模板,只支持C语言的函数和结构体的封装。支持指针形式的数组访问,支持结构体封装,支持以结构体指针形式作为参数和返回值。支持一级指针。理论上支持多级...

    C++模板使用介绍

    我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数

    详解C++ 模板编程

    类型模板包括函数模板和类模板,基本上是C++开发人员接触模板编程的起点。 下面代码演示了函数模板和类模板的使用方法: // 函数模板 template T add(const T& a, const T& b) { return a + b; } // 类模板 ...

    C++——函数模板.txt

    函数模板 建立一个通用的函数,函数类型和形参不具体指定,用一个虚拟的类型代表。 只要是函数体是相同的就可以用这个...(只适用于函数的参数个数相同而类型不同,且函数体一致的情况,如果参数个数不同,则不适用。

    C++模板学习\模板的概念\函数模板的写法

    我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载...

    详解c++11新特性之模板的改进

    函数模板的默认模板参数 模板的右尖括号 C++11之前是不允许两个右尖括号出现的,会被认为是右移操作符,所以需要中间加个空格进行分割,避免发生编译错误。 int main() { std::vector&lt;std&gt;&gt; a; // error std::...

    C++简单内存池模板类实现

    自己实现的c++内存池,模板类实现,具备基础内存块,递增梯度,最大内存块等配置参数,初始化时分配好一批内存块供作用,当内存块不够使用时,已经分配内存块小于最大内存块个数,则再分配递增梯度个内存块,如果...

    深入应用C++11:代码优化与工程级应用

    比如auto和decltype让我们从书写冗长的类型和繁琐的类型推断中解脱出来,智能指针让我们再也不用担心内存泄漏的问题,右值引用避免了无谓的临时对象拷贝,type_traits和可以变模板参数让我们可以更方便地写更加泛化...

    深入分析C++模板特化与偏特化

    模板特化(template specialization)不同于模板的实例化,模板参数在某种特定类型下的具体实现称为模板的特化。模板特化有时也称之为模板的具体化,分别有函数模板特化和类模板特化。 1.2函数模板特化 函数模板特化...

    深入理解C++11:C++11新特性解析与应用

    1746.1.2 常量表达式函数 1766.1.3 常量表达式值 1786.1.4 常量表达式的其他应用 1806.2 变长模板 1836.2.1 变长函数和变长的模板参数 1836.2.2 变长模板:模板参数包和函数参数包 1856.2.3 变长模板:进阶 1896.3 ...

    C++学习之模板特例化

     当特例化一个函数模板时,必须为原模板中的每个模板参数都提供实参。使用关键字template后跟一个空尖括号&lt;&gt;,即template &lt;&gt;,以指出我们正在特例化一个模板。   template &lt;typename&gt;

Global site tag (gtag.js) - Google Analytics