类模板参数

实际上有三种类型模板参数:类型模板参数、无类型模板参数和模板模板参数(以模板作为模板的参数)。

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:

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().

时间: 2024-10-12 21:00:09

类模板参数的相关文章

编程算法 - 不能被继承的类(模板参数友元) 代码(C++)

不能被继承的类(模板参数友元) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 用C++设计一个不能被继承的类. 可以使用模板类模板参数友元, 模板类私有构造函数, 类虚继承这个模板类, 如果类被其他类继承时, 则虚继承会直接调用模板类, 无法构造. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #inc

类模板参数带默认值

类模板参数可以带默认值吗?答案当然是肯定的.看过STL源码的人就知道,STL里面大量使用了模板技术. 有兴趣的可以去看看STL的源码,从中可以学到不少知识. 今天,我就写一个带默认值的类模板,如下: #pragma once template<typename T, typename T defValue = NULL> class CType { public: CType() :m_value(defValue) { } ~CType() { } BOOL IsNull() const {

类模板使用示例(五) 非类型类模板参数

Stack4.hpp的代码如下: #ifndef STACK4_HPP #define STACK4_HPP #include <iostream> #include <vector> #include <stdexcept> template <typename T, int MAXSIZE> class Stack { public: Stack(); void push(T const&); void pop(); T top() const;

C++模板编程 - 第三章 类模板

模板类 template<typename T> stack {...} 的构造函数应该写作stack而不是stack<T>,经作者这么一说我在注意到这件事情. 模板的特化 先说说函数模板.函数模板只能全特化,不能偏特化,并且特化的模板函数相比于等价模板函数优先,但是和非模板函数相比非模板函数优先. 1 #include<iostream> 2 3 using std::cout; 4 using std::endl; 5 6 // version 1 7 int ma

模板参数推导

模板参数推导(template argument deduction),是在调用C++的模板函数时,由编译器根据使用上下文来推断所调用的模板函数的模板参数.这一概念也适用于类的模板成员函数. 类模板也存在模板参数推导的情形.例如: template <class T> struct eval; template <template <class, class...> class TT, class T1, class... Rest> struct eval<TT

c++数组类模板的实现

1.预备知识 (1)模板参数不仅仅可以是类型参数,还可以是数值型参数. 如: template <typename T, int N>//int N就是数值型参数, 要注意这个int类型,因为这里要注意数值型参数的限制,下面有说数值型参数的限制. void func() { T a[N];//使用模板参数来定义局部数组,模板的数值型参数来表示数组的大小. } func<double, 10>();//这样进行使用,数值型参数,也就是第二个参数要是常量,因为这是数值型模板参数的限制造

C++—模板(2)类模板与其特化

我们以顺序表为例来说明,普通顺序表的定义如下: 1 typedef int DataType; 2 //typedef char DataType; 3 class SeqList 4 { 5 private : 6 DataType* _data ; 7 int _size ; 8 int _capacity ; 9 } ; 模板类也是模板, 必须以 关键字templ ate开头, 后接模板形参表. 模板类一般格式如下:template<class 形参名 1, class 形参名 2, .

C++中的类模板详细讲述

一.类模板定义及实例化 1. 定义一个类模板: 1 template<class 模板参数表>2 3 class 类名{4 5 // 类定义......6 7 }: 其中,template 是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是类型参数 ,也可以是非类型参数.类型参数由关键字class或typename及其后面的标识符构成.非类型参数由一个普通参数构成,代表模板定义中的一个常量. 例: 1 template<class type,int widt

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始