`

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++模板编程 源码

    C++模板是C++语言中的一个强大特性,它允许我们编写通用代码,实现代码复用,提高效率。在深入实践C++模板编程的过程中,我们不仅可以理解模板的基本概念,还可以掌握其高级特性和应用技巧。 首先,我们要理解模板...

    C++模板中文 PDF 版 不错的c++模板书籍

    《C++模板中文版》是一本深入探讨C++模板编程技术的专业书籍,旨在帮助读者全面理解和掌握这一核心的C++特性。C++模板是C++语言中的一个强大工具,它允许程序员创建泛型代码,实现代码重用和类型安全。在阅读这本书...

    C++模板全览

    C++模板是编程语言中的一个强大特性,它允许程序员创建泛型代码,即代码可以处理多种数据类型。这篇由侯捷等译的《C++ Templates:The Complete Guide》全面介绍了C++模板的各个方面,旨在帮助开发者更高效地利用这...

    c++模板元编程代码

    C++模板元编程是一种在编译时执行计算和创建代码的技术,它利用了C++模板系统的能力,将编程任务从运行时转移到了编译时。模板元编程允许开发者编写更高效、更灵活的代码,特别是在处理类型系统和泛型算法时。在本...

    c++模板经典书籍

    4. **模板模板参数**: - 允许模板接受其他模板作为参数,例如`std::function`可以接受任何可调用对象,包括函数指针、成员函数指针和具有适当调用约定的类模板。 5. **模板的依赖性解析**: - 在模板的实例化...

    c++ 模板使用入门

    本篇将深入探讨C++模板的基本概念、用法以及在实际编程中的应用。 ### 一、函数模板 函数模板是用于生成特定类型函数的通用模板。它们定义了一种算法,而不关注具体的类型。例如,`swap` 函数模板可以交换两个变量...

    C++模板中文版及源代码

    C++模板是C++编程语言中的一个重要特性,它允许程序员创建通用代码,可以在不同数据类型上重复使用。这种代码重用的方式提高了效率,减少了代码冗余,并且在编写泛型算法时尤其有用。《C++模板中文版》这本书无疑是...

    C++模板元编程

    ### C++模板元编程 #### 一、C++模板元编程概述 在现代软件开发领域,C++模板元编程(Template Metaprogramming)是一种利用C++编译器的类型系统来实现计算逻辑的技术。它允许程序员在编译时执行复杂的算法和数据...

    C++ 模板类 简单试用

    C++模板类是C++语言中的一个重要特性,它允许我们编写通用代码,这些代码可以用于处理不同类型的数据。模板类的出现使得程序员可以创建泛型(generic)容器、算法和其他工具,无需为每种数据类型单独编写代码。下面...

    C++模板元编程技术与应用

    元数据可以是模板参数,包括枚举、函数指针、全局对象引用等。虽然标准中没有提供编译期浮点数计算,但有一些实验性的探索。 书中后续章节涵盖了控制结构、数据结构、数值计算、类型计算、代码生成、断言和契约、库...

    如何理解c++模板

    在这个例子中,`template&lt;class T&gt;` 定义了一个模板参数 `T`,该参数表示函数 `GetSize` 可以接受任何类型的 `std::vector` 参数。这意味着函数可以根据实际调用时使用的类型进行实例化。 #### 五、模板实例化 ...

    c++模板的讲解

    C++模板详解 C++模板是C++编程语言中的一种重要机制,它允许开发者编写通用的函数和类,以适应不同的数据类型。模板的出现解决了函数重载的问题,使得代码更加简洁和灵活。本文将详细讲解C++模板的概念、声明、使用...

    C++模板元编程技术与应用 荣耀

    C++模板元编程是一种在编译时进行计算和代码生成的技术,它利用C++模板机制的强大功能,将元数据转化为可执行的代码。这一技术在提高程序效率、减少运行时开销、实现类型安全和静态多态等方面具有显著优势。在“C++...

    C++中有关模板的试题题型练习题

    C++模板技术综合应用 C++中有关模板的试题题型练习题是C++模板类型题型的综合应用,涵盖了函数模板、类模板的设计方法和实现。下面对标题、描述、标签和部分内容进行详细的解释和分析。 一、函数模板设计 函数...

    c++模板元编程

    C++模板允许我们编写参数化的函数和类,这些参数可以是类型或者非类型值。通过这种方式,我们可以创建出能够适应多种输入的通用代码。例如,`std::vector`就是一个模板类,它可以接受不同类型作为元素,如整数、...

    C++模板(侯捷等)

    类模板则用于创建泛型类,这些类可以拥有模板参数,使得类的行为可以针对不同的数据类型进行定制。例如,我们可以定义一个`Stack`类模板,用于存储任意类型的数据: ```cpp template class Stack { public: void ...

    c++模板教材

    C++模板是C++编程语言中的一个重要特性,它允许程序员创建泛型代码,即能够处理多种数据类型的代码。模板在C++中分为两种主要类型:函数模板和类模板。本教材详细介绍了这两种模板的使用方法及其背后的原理。 一、...

    C++之模板编程

    C++模板还支持一些高级特性,比如模板特化、模板模板参数等。模板特化允许对特定类型提供特定的模板实现,而模板模板参数则允许模板的参数自身也是一个模板。这些特性大大增强了模板编程的灵活性和能力。 在C++11及...

Global site tag (gtag.js) - Google Analytics