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

C++仿函数和typename的用法相关推荐

  1. 模板类中 typename的用法,以及函数的定义和声明

    typename 的用法: 第一种 template<typename T> 这种大家都知道, 和 template<class T> 一样,就不多讲解了 第二种: 嵌套从属名 ...

  2. C++中typename的用法

    1.typename的常规用法 typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数: 2.typename的第二个用法:修饰类型 template ...

  3. typedef 与 typename 的用法

    一.typedef:类型说明 类型说明的格式为: typedef 类型 新定义名: 类型说明只定义指定的一个类型的新名字,并不是定义一种新的数据类型. eg: typedef int INT; 这样声 ...

  4. 关键字typename的用法

    变量类型定义 C++在泛型编程中是和class类似的用法 template <typename T> inline T GetMax(T m, T n) { return m > n ...

  5. typename 的用法

    Usage typename 主要有两个作用,让我们先来看看参考手册对该关键字的说明. In the template parameter list of a template declaration ...

  6. typename关键字用法

    阅读某开源代码,利用模板特新创建一个指针池时,对下面的两行代码产生了困惑 template<typename T> class NetPointerPool { public: typed ...

  7. C++ typename 的双重含义

    1.模板类型参数申明 使用模板时,在申明模板类型参数时,我们经常有如下两种申明方式: // 方式一 template <class T> CTest;// 方式二 template < ...

  8. c++中的typename与class

    在泛型编程的形参表中,关键字typename和class具有相同的含义,可以相互使用,两个关键字都可以在同一模板形参表中使用: 1.  typename用在模板定义里,标明其后的模板参数是类型参数. ...

  9. C++ sizeof用法总结

     sizeof sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标 ...

  10. C++ sizeof用法

    sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的头文件stdd ...

最新文章

  1. 【Flutter】开发 Flutter 包和插件 ( 开发 Dart 插件包 | 发布 Dart 插件包 )
  2. Spring4新特性——Web开发的增强
  3. SQL update select结合语句详解及应用
  4. CentOS Linux 7.7 安装kafka zookeeper
  5. PHP的rm指令,git rm 命令
  6. java 手写 jvm高性能缓存
  7. 16F877A和24C02通信汇编语言,PIC16f877A读写24c02程序
  8. SSH如何通过公钥连接云服务器
  9. linux添加ipv6默认路由表,IPv6及静态路由配置
  10. PL/SQL 快捷键设置
  11. OpenCV读取网络摄像头视频并保存到本地
  12. fastjson list转json
  13. 实验二 预测分析算法的设计与实现
  14. 如何卸载Adobe Premiere Pro CC 2017和Adobe Photoshop CC 2018
  15. 通过--amend和rebase修改git commit提交的注释信息
  16. 如何重装oracle数据库,oracle数据库的重装
  17. 世界上还是好人多啊!
  18. 使用webp进行图像压缩
  19. webm转换mp4最简单方法?
  20. C#中,System.ComponentModel.Container详解

热门文章

  1. 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_04.mybatis概述
  2. git error: failed to push some refs to...
  3. 关闭jtag保留swd
  4. IOS音频1:之采用四种方式播放音频文件(一)AudioToolbox AVFoundation OpenAL AUDIO QUEUE...
  5. 我的大学生活-4-21-吕家尧
  6. [Node.js]001.安装与环境配置
  7. 支持向量机很全的代码和数据集
  8. Linux下Openssl的安装
  9. Sql Sever 注册服务器 [SQL Server]
  10. vue中使用echarts