参考: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. Python 编程快速上手 第七章总结

    前言 在 Word 软件中,我们总是习惯使用 CMD+F 用来查找和替换文本,但是,正如作者所说: 虽然计算机可以很快地查找文本,但你必须精确地告诉它要找什么. 我们往往想要查找一类文本,比如一段文本 ...

  2. clustering

    搞了将近一年的单细胞,聚类也是自认为得心应手了,自信满满. 但是多半是跑软件,对聚类的深层次的思想不甚了了. Google了一下clustering,看了一篇文章,突然了解到了clustering的算 ...

  3. C# 编写WCF简单的服务端与客户端

    http://www.wxzzz.com/1860.html Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Win ...

  4. LeetCode--303--区域和检索 - 数组不可变

    问题描述: 给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点. 示例: 给定 nums = [-2, 0, 3, -5, 2, -1 ...

  5. android -------- android studio 中设置创建类时的说明信息(包含 作者 ,创建时间,注释说明等)

    今天简单来说一下android studio开发工具中的 一个小设置功能: 在开发过程中我们习惯给新建的类添加一些注释信息,创建日期.时间和作者等. 设置信息 File—>Settings—&g ...

  6. apicloud 按返回键

    api.addEventListener({ name: 'keyback' }, function(ret, err) { //调取index.html暴露的方法 api.execScript({ ...

  7. python+requests接口自动化测试框架实例详解教程

    1.首先,我们先来理一下思路. 正常的接口测试流程是什么? 脑海里的反应是不是这样的: 确定测试接口的工具 —> 配置需要的接口参数 —> 进行测试 —> 检查测试结果(有的需要数据 ...

  8. php-fpm的错误日志

  9. 5月21 回话控制SESSION COOKIE

    百科 HTTP普及(无状态性) 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP ...

  10. 【Oracle】【6】去掉字符串最后一个特殊字符

    --去除字符串末尾的省字,若无省字则无变化 SELECT DISTINCT TRIM('省' FROM PROVINCE) PROVINCE FROM ADDRESS 参考博客: 1,使用oracle ...