[013]模板-非类型模板参数

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

temlate<unsigned N, unsigned M>
int foo(const char (&p1)[N], const char (&p2)[M]) {
    return strcmp(p1,p2);
}

但是需要注意的是:编译器会在一个字符串字面常量的末尾插入一个空字符作为终结符。

例如我们调用

foo("hi", "mom");

实际上编译器会实例化如下版本

int foo(const char (p1)[3], const char (p2)[4]);

-----------

总结:在模板定义内,模板非类型参数是一个常量值。在需要常量表达式的地方,可以使用非类型参数,例如指定数组的大小等。

时间: 2024-10-11 23:16:48

[013]模板-非类型模板参数的相关文章

C++非类型模板参数

对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数.在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定.但是在这里,我们面对的是这些细节是值,而不是类型,当要使用基于值的模板时,必须显式地指定这些值,才能够对模板进行实例化. 本文地址:http://www.cnblogs.com/archimedes/p/cpp-template-type.html,转载请注明源地址. 在上篇文章(C++类模板)中我们介绍了一个stack类模

非类型模板参数

对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数.在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定.但是在这里,我们面对的是这些细节是值,而不是类型,当要使用基于值的模板时,必须显式地指定这些值,才能够对模板进行实例化. 非类型的类模板参数 创建类的头文件 #include<stdexcept> #include<iostream> using namespace std; template<typen

C++模板编程 - 第四章 非类型模板参数

一个例子是 1 template<typename T, int MAXSIZE> 2 class Stack {}; 在这里我就想起了C语言是怎么弄数据结构的,不得不说模板是很方便的东西.上面的例子是一个类模板,函数模板其实也是类似的. 浮点数和类对象是不允许作为非类型模板参数的. 对上面这句话的补充:这是历史原因,C++ Templates的作者认为C++在未来可能会允许使用浮点数和类对象作为非类型模板参数. 不太好理解的是这个例子 1 template<char const * n

C++标准库函数 end 的实现原理(非类型模板参数)

在刚开始学习<C++ Primer>的时候遇到了 end 函数,感觉很神奇,但又很迷惑:为什么能获得数组的尾后指针呢?编译器也不会在内存中申请一块空间放数组元素的个数啊!最近再一次遇到了 end 就看了一下它的实现终于明白了. 先说以下C语言中获得数组元素个数的方法. int arr[] = {1, 2, 3}; size_t n = sizeof(arr) / sizeof(int); //n为元素个数 sizeof 返回一个常量表达式,是在编译时期确定返回值的.也就是说在编译时期是可以知道

读boost::multi_array有感,多维数组实现(非类型模板,偏特化)

开发环境: VS2002(VC7) 本文做如下简化: 1,假定所有维元素都是5. 2,不考虑const的[]. 3,由于只是熟悉原理,不考虑各种异常情况. 问题一,请实现一个一维整形数组,只需重载[]. 问题二,请实现一个二维整形数组,只需重载[]. 源码如下: class CIntArray1 { public: int& operator[](int index) { return m_pData[index]; } protected: int m_pData[5]; }; class C

C++学习之模板 ----函数模板、类模板

本博文主要讨论函数模板与类模板以及其简单应用. 1).作用:函数模板和类模板都可以看做是一种代码产生器,往里面放入具体的类型,得到具体化的函数或者class. 2).编译(分为两步): a):实例化之前,先检查模板本身语法是否正确: b):根据 函数调用或者类模板调用 ,先去实例化模板代码,产生具体的函数/类. 也就是说, 没有函数调用或者类类型对象声明,就不会实例化模板代码,在目标文件obj中找不到模板的痕迹. 3):优缺点 模板的缺点是代码膨胀,编译速度慢,而优点是运行速度快. 一.函数模板

函数模板与模板函数及模板类与模板的特化

函数模板( Function templates) * 模板(Templates)使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载.这在一定程度上实现了宏(macro)的作用.它们的原型定义可以是下面两种中的任何一个: template <class identifier> function_declaration; template <typename identifier> function_decla

定义模板——函数模板和类模板

面向对象编程(OOP)和泛型编程都能处理在编写程序时不知道类型的情况.不同之处在于:OOP能处理类型在程序运行之前都未知的情况:而在泛型编程中,在编译时就能获知类型了. 前面介绍的容器.迭代器和算法都是泛型编程的例子.当我们编写一个泛型程序时,是独立与任何特定类型来编写代码的.当使用一个泛型程序时,我们提供类型或值,程序实例可在其上运行. 模板是泛型编程的基础.一个模板就是一个创建类或函数的蓝图或者说公式.当使用一个vector这样的泛型类型,或者find这样的泛型函数时,我们提供足够的信息,将

模板(三) 函数模板

一.函数模板介绍 函数模板是一个生成函数的公式,可以用来生成针对特定类型的函数版本: 如:求两个具有相同的数据类型的数值中的最大值:普通的一个函数只能使用于某种特定类型,不能适用于其他数据类型,而使用函数模板则可以进行泛型编程, 对于使用该函数模板的各个数据类型在编译时期则会生成相应的适用于该数据类型的函数版本,这样就避免对于每一种数据类型编写相应的函数版本, 可以加快开发速度,减少不必要的重复代码. template<typename T> T Max(const T &lhs, c