博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++仿函数和typename的用法
阅读量:5173 次
发布时间:2019-06-13

本文共 930 字,大约阅读时间需要 3 分钟。

1.仿函数的定义是很简单的,就是一个重载了括号()运算符的类,也被称为函数对象。

主要是用于个性化扩展算法对象。stl中实现了好多算法,每个算法都可以完成日常的大部分工作,设计者还允许你在这些强大的算法上再插上别的功能。

怎么插?插的比较泛型和object oriented?这就需要直接把你想添加的功能做参数传给算法对象,于是他们就弄出来个函数对象,让你用起来像函数,但插起来像普通的C++类

比如定义一个仿函数

template <class T>

class functor

{

T operator()(T x){return x+x;}

};

cout<<functor<int>()(2);

好了这就是仿函数。

2.typename

先看问题

template <class T>

class Test

{

typedef T argument_type;

}

 

template <class T2>

class Test2

{

T2::argument_type*x;

}

Test2<Test> obj;

cout<<obj.x;

Test2模板类有点特别,它实例化的时候模板参数必须要有argument_type这个成员,而且这个arguement_type也比较特别,它是一个类型定义成员,不是用来运算而是用来定义别的变量。按惯例编译器会把T2::argument_type这种写法当作静态成员处理,但是这里如果按照静态成员去解析一个类型定义显然会报错,而且即使编译器考虑到T2::argument_type有可能是个类型定义,那它也无从追溯,对于模板参数T2及其成员,在Test2实例化之前编译器根本不知道这些信息,除非加typename显式声明。

另外,让我们再从编译器的角度看待实例化。

我们认为定义对象是一个实例化的过程,其实编译器得到这样一个指示后并不为对象分配内存,它仍然是为程序的运转做规划,编译后的文件实际上就是一份程序执行方案。何为实例化,答案是we don't care。我们当然是只关注问题的解决,而不是概念本身。

 

转载于:https://www.cnblogs.com/sky-view/p/3246652.html

你可能感兴趣的文章
SpringMVC中@RequestMapping参数设置
查看>>
lea实现加法
查看>>
文件操作
查看>>
spring容器启动的加载过程(三)
查看>>
jdbc连接数据库代码
查看>>
loadrunner使用system()函数调用Tesseract-OCR识别验证码遇到的问题
查看>>
【XSY2731】Div 数论 杜教筛 莫比乌斯反演
查看>>
flash 随机函数
查看>>
一些命令及参数
查看>>
Bootstrap validation
查看>>
2017.4.18-morning
查看>>
ACE6.3.3在Linux(CentOS7.0)下的安装和使用
查看>>
面试准备
查看>>
mysql 1067
查看>>
java之接口适配器
查看>>
nginx安装手册
查看>>
动态将ASPX生成HTML网页并将网页导出PDF
查看>>
Find Backpacker Jobs in Australia
查看>>
面试题:return和finally执行
查看>>
Heroku第三方服务接入指南(二)
查看>>