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。我们当然是只关注问题的解决,而不是概念本身。

C++仿函数和typename的用法的更多相关文章

  1. typename的用法

    template <class T> void foo() { typename T::iterator * iter; } class ContainsAType{ public: cl ...

  2. typedef typename的用法

    我自己最后在这篇文章里理解:[C++]typedef typename什么意思? typedef typename A::a_type b_type; 其中typename是告诉编译器A::a_typ ...

  3. STL——仿函数(函数对象)

    一.仿函数(也叫函数对象)概观 仿函数的作用主要在哪里?从第6章可以看出,STL所提供的各种算法,往往有两个版本,其中一个版本表现出最常用(或最直观)的某种运算,第二个版本则表现出最泛化的演算流程,允 ...

  4. STL源码剖析(仿函数/bind2nd)

    仿函数(functors)其实就是重载了operator()的对象. 下面简单先看看它的一个例子: #include <iostream> using namespace std; tem ...

  5. Functor仿函数

    转载声明:本文转自网络,稍加整理以备学习和參考之用. 函数对象/仿函数 提到C++ STL.首先被人想到的是它的三大组件:Containers, Iterators, Algorithms,即容器,迭 ...

  6. C++进阶--模板及关键字typename

    //############################################################################ /* * 模板介绍 */ //函数模板 t ...

  7. STL 仿函数(函数对象)

    ##定义 仿函数(functor):一种具有函数性质的对象. 仿函数在C++中的新名称为函数对象(function object). 仿函数类对象像函数一样被调用,调用仿函数类对象时,实际调用的是仿函 ...

  8. 数组类型与sizeof与指针的引用

    以char类型为例: char a[100];     //a类型为char[100]    &a类型为 char (*)[100]    *a类型为char char *p = a;     ...

  9. 各大IT公司校园招聘程序猿笔试、面试题集锦

    转自:http://blog.csdn.net/hackbuteer1/article/details/7959921#t4 百度一面 1.给定一个字符串比如“abcdef”,要求写个函数编程“def ...

随机推荐

  1. 对于C#中的一些点滴你真的理解了吗?

    废话不多说看题目,看看我们自己真的理解了吗? 1.如下代码输出的结果是什么? public class A{ public virtual void Func(int  number=10) { Co ...

  2. table td的宽度详解

    前言:一直总觉得td的宽度好难驾驭,但万事万物总是有规律的.就像亮剑说的:不用因为怕八路就敬而远之,应该靠上去,熟悉他们,了解他们.   正文:           Table只有Table的宽度是可 ...

  3. json_decode 与 json_encode 的区别

    1.json_decode对JSON格式的字符串进行编码 2.json_encode对变量进行 JSON 编码 3.unset()是注销定义的变量 4.urlencode()函数原理就是首先把中文字符 ...

  4. char, signed char, and unsigned char in C++

    关于这三者的区别stackoverrflow里有一个答案是这样说的: 3.9.1 Fundamental types [basic.fundamental] 1 Objects declared as ...

  5. C++11 实现 argsort

    看python发现有这么个api,感觉很实用,想着stl里会不会有这个呢?查了半天毫无结果.于是用lambda自己实现了下. 以vector为例 template<typename T> ...

  6. 玩转无线电 -- GPS Hacking (上)

    0x00 序 GPS Hacking 在过去几年的安全会议上一直都是很受关注的议题. 但往往因为内容太过学术化, 所需设备成本太高. 让许多感兴趣的朋友苦于无法入门. 直到GPS-SDR-SIM 这类 ...

  7. Discuz 插件制作之后台常用函数详解

    目录 showsetting()表单显示 cpmsg()提示消息 showformheader()创建表单头 showformfooter()创建表单尾 showtableheader()创建表格头 ...

  8. iOS:测试机添加

    一,首先打开开发者首页:https://developer.apple.com/,点击Member Center二,点击certificates,Identifiers & Profiles三 ...

  9. 【转】互联网全站HTTPS的时代已经到来

    原文地址:http://blog.csdn.net/luocn99/article/details/39777707 前言 我目前正在从事HTTPS方面的性能优化工作.在HTTPS项目的开展过程中明显 ...

  10. magento additional & details 分解开来

    <?php foreach ($this->getChildGroup('detailed_info', 'getChildHtml') as $alias => $html):?& ...