参考:http://www.weixueyuan.net/view/6400.html

总结:

  模板类至少有一个类参数,但是可以有多个参数,这些参数中可以存在非类类型的参数。 类参数是指 class T,class R T 、R 为类参数。

  系统内建的普通数据类型参数或程序自定义的数据类型参数,我们将这种非类类型的参数称之为函数式参数。  

  在模板类实例化过程中,我们需要用具体的数据类型来代替类参数,用具体的数值来替换函数式参数,如此才能实例化成功。 

  

在前面我们已经提到过模板类至少有一个类参数,但是可以有多个参数,这些参数中可以存在非类类型的参数,例如系统内建的普通数据类型参数或程序自定义的数据类型参数,我们将这种非类类型的参数称之为函数式参数。

例1:

template< class T, int S, double R>
class test
{
//......
};

在本例中例举了函数式参数的用法,在模板头中,先是一个类参数T,之后是两个函数式参数S和R。

例2:

#include <iostream>
using namespace std; template< class T , int S>
class array
{
public:
array();
T & operator[]( int );
const T & operator[] ( int )const;
int getlen()const{ return length; }
~array();
private:
int length;
T * num;
}; template< class T , int S>
array<T, S>::array()
{
num = new T[S];
length = S;
} template< class T , int S>
array<T, S>::~array()
{
delete[] num;
} template< class T , int S>
T & array< T, S > ::operator[] (int i)
{
if( i < || i >= length)
throw string( "out of bounds" );
return num[i];
} template< class T , int S>
const T & array< T, S > ::operator[] ( int i ) const
{
if( i < || i >= length)
throw string( "out of bounds" );
return num[i];
} template< class T , int S>
ostream & operator<<( ostream & out, const array <T, S> & A)
{
for(int i=; i < A.getlen(); i++)
out<< A[i] << " ";
return out;
} int main()
{
array< int, > A;
for(int i = ; i < ; i++)
{
A[i] = *i;
}
cout<< A << endl;
return ;
}

在本例中,我们将前面的array模板类进行了修改,使之有两个参数,一个是类参数T,另一个是函数式参数S。修改后的array模板类用默认构造函数替代了带参构造函数。因为在模板类中添加了一个函数式参数 S 以表示数组的大小,因此我们就不需要在定义对象时利用带参构造函数的参数来确定数组的大小。在前面array模板类,我们需要以以下的方式定义对象:

array< int > A();
array< string > S();

修改后的array,我们只需要按照如下方式定义对象:

array< int,  > A;
array< string, > S;

修改后的array类的类名变为了array< T, S >。对于修改后的array类,想要将其实例化则必须提供两个参数的实例,例如:

array< int,  > A;
array< double, > D;

都是可以正确实例化并定义对象的,但是如果只提供一个参数则是不可以的,例如:

array< int> A;
array< > D;

这两种情况都是错误的的实例化。

在模板类实例化过程中,我们需要用具体的数据类型来代替类参数,用具体的数值来替换函数式参数,如此才能实例化成功。

 

7.3 C++模板中的函数式参数的更多相关文章

  1. C++学习35 模板中的函数式参数

    C++对模板类的支持比较灵活,模板类的参数中除了可以有类型参数,还可以有普通参数.例如: template<typename T, int N> class Demo{ }; N 是一个普 ...

  2. [原创]java WEB学习笔记109:Spring学习---spring对JDBC的支持:使用 JdbcTemplate 查询数据库,简化 JDBC 模板查询,在 JDBC 模板中使用具名参数两种实现

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

    C#中的函数式编程:递归与纯函数(二)   在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...

  4. C++17尝鲜:类模板中的模板参数自动推导

    模板参数自动推导 在C++17之前,类模板构造器的模板参数是不能像函数模板的模板参数那样被自动推导的,比如我们无法写 std::pair a{1, "a"s}; // C++17 ...

  5. 如何在模板中引用参数类中的一个特定member

    C++模板有很多特性需要我们去挖掘,很多新的设计模式也都与模板使用相关,我们知道模板的一个基本特性就是可以根据传入的类型产生新的类型.围绕这个特性,可以衍生出很多的其它特性,比如自动为不同的类生成st ...

  6. 【解决了一个小问题】golang gin框架中的模板,让模板中的参数不要做HTML转义

    代码中使用了类似的方式来向模板填充参数: c.HTML(200, "list.html", gin.H{"data":builder.String()}) 模板 ...

  7. 在引用的laravel的@include子模板中传递参数

    调用传参: @include("message",['msg'=>'中国']) 在message子模板中调用msg的值: {{msg}}

  8. Thymeleaf+SpringMVC,如何从模板中获取数据

    Thymeleaf+SpringMVC,如何从模板中获取数据 在一个典型的SpringMVC应用中,带@Controller注解的类负责准备数据模型Map的数据和选择一个视图进行渲染.这个模型Map对 ...

  9. django 模板中url的处理

    在模板中直接添加‘/home’这样的链接是十分不推荐的,因为这是一个相对的链接,在不同网页中打开可能会返回不一样的结果. 所以推荐的是 <a href="{{ object.get_a ...

随机推荐

  1. 数据结构(C语言版)-第7章 查找

    7.1 查找的基本概念 查找表:    由同一类型的数据元素(或记录)构成的集合静态查找表:    查找的同时对查找表不做修改操作(如插入和删除)动态查找表:    查找的同时对查找表具有修改操作关键 ...

  2. HeadFIrst Ruby 第七章总结 hashes

    前言 这一章节介绍了 Ruby 中 hash 这一数据类型的用法和特征. Hash 的定义 与 array 的对比 最大的不同: An array can only use integers as i ...

  3. javascript ----> Immediately-Invoked Function Expression (IIFE)(翻译)

    http://benalman.com/news/2010/11/immediately-invoked-function-expression/ 如果你没有注意到,我对术语有一点点坚持. 所以,在听 ...

  4. 腾讯tOS死亡或注定,为何国内无自主ROM?

    http://tech.sina.com.cn/roll/2017-06-26/doc-ifyhmtrw4006354.shtml 腾讯OS死亡或注定,为何国内无自主ROM? 2017年06月26日 ...

  5. TP5中即点即改,json分页,单删

    HTML页面: <!doctype html><html lang="en"><head> <meta charset="UTF ...

  6. 『MXNet』im2rec脚本使用以及数据读取

    一.im2rec用法简介 首先看文档: usage: im2rec.py [-h] [--list] [--exts EXTS [EXTS ...]] [--chunks CHUNKS] [--tra ...

  7. 类似“未能加载文件或程序集“tesseractengine3”或它的某一个依赖项”等一些问题的解决方案

    有些时候我们引用了一些32位的dll,结果就会出现类似“未能加载文件或程序集“tesseractengine3”或它的某一个依赖项”这样的问题,原因是IIS的应用程序池的设置中默认是不启用32位的应用 ...

  8. ECharts 报表事件联动系列三:柱状图,饼状图实现联动

    源码如下: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  9. SpringBoot系列之Hikari连接池

    1.springboot 2.0 中默认连接池是Hikari,在引用parents后不用专门再添加依赖 2.application.yml中的配置 # jdbc_config datasource s ...

  10. 牛客第二场Dmoney

    链接:https://www.nowcoder.com/acm/contest/140/D 来源:牛客网 题目描述 White Cloud has built n stores numbered to ...