Tr1::function的介绍

它是一个类模板,类的成员变量是一个函数指针。可以把它看作一个智能函数指针(和shared_ptr智能指针对比着理解)。

一. 头文件

#include<functional>

二. 使用

//t.cpp
#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;
void foo(int i){cout<<"aaa"<<endl;}
void (*p)(int)=foo;
int _tmain(int argc, _TCHAR* argv[])
{
  function<void (int)> fm;
  fm=foo;
  (*p)(2);
  fm(2);
  return 0;
}

可以看出它和函数指针很像,但是它具有很多函数指针做不到的事情。下面慢慢说。

1. 定义一个function对象。

由于function是一个类模板,所以使用起来,首先定义一个类的对象。

Function <void (int)> fm;-----<>中第一个参数是要绑定函数的返回类型,第二个参数是要绑定的函数的参数列表。注意使用小括号括起来。

2. 像函数指针一样,这个指针需要指向某个函数。

fm=function<void (int)>(foo);

3. 由于类模板function重载了()符号。所以使用起来比函数指针更易用。

Fm(2);

下面说一下为什么要有tr1::function.也就是它相对于函数指针的优点:

1. 绑定的函数的类型

函数指针只能绑定普通的外部函数。而tr1::function可以绑定各种函数类型。

(1) 外部普通函数和类的static函数

//t.cpp
#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;
class A{
public:
static void foo(inti){cout<<"aaa"<<endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
  function<void (int)>fm(A::foo);
  //function<void (int)> fm;fm=function<void(int)>(A::foo); also OK
  void (*p)(inti)=A::foo();//error
  fm(2);
  return 0;
}

因为外部函数和类的static很相似,所以使用起来也很相似。

(2)类的非static成员函数。

//t.cpp
#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;
class A{
public:
void foo(int i){cout<<"aaa"<<endl;}
};
int _tmain(int argc, _TCHAR* argv[])
{
  A b;
  function<void (int)>fm=bind(&A::foo,b,tr1::placeholders::_1);//OK
  //function<void (int)> fm=b.foo();//error
  fm(2);
  return 0;
}

注意必须是&A::foo(),这个符号&不能少,这是由function决定的。这里bind中的foo只是接受一个参数, 而实际上是需要两个参数,因为static函数是没有对象就存在的,而非static成员函数必须有对象之后才能存在,所以这个成员函数需要指明是哪个对 象的成员函数。

(3) 绑定虚函数,呈现多态

<pre class="prettyprint cpp">//t.cpp#include "stdafx.h"#include<iostream>#include<functional>using namespace std;class A{public: virtual void foo(int i){cout<<"A"<<endl;} void fun(){ function<void (int)>fm=bind(&A::foo,this,tr1::placeholders::_1); fm(2);//这里和直接调用foo();效果是一样的。并没有改变它的多态性质}};class B:public A{public:void foo(inti){cout<<"B"<<endl;}};int _tmain(int argc, _TCHAR* argv[]){ B b; b.fun(); return 0;}

其实这里并不是function的什么特殊性质,而只是function是一个普通的类而已,不是因为它而改变多态性质。这里和直接调用foo();的效果一样。

2. 构造函数中的参数

(1) 首先是函数名,这个上面已经讲过

(2) 可以是一个函数对象!(函数对象就是一个重载了操作符”()”的类,这样类的对象可以:a(…);使用起来很像函数,所以叫做函数对象)

//t.cpp
#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;
class A{
public:
  void operator()(int i){cout<<"A"<<endl;
  }
  void foo(){}
};
int _tmain(int argc, _TCHAR* argv[])
{
  A a;
  function<void (int)> fm(a);
  fm(2);
  return 0;
}

注意这里,居然可以把一个类对象放到function里!这好像违反了function函数指针的原意。但是注意:由于function没有提 供返回它拥有的东西的函数,所以这里只能fm(2);来调用类中的重载()函数。不能调用类中的其他函数。所以它还是一个函数指针,只是这个指针指向的函 数是一个类中的重载()函数罢了。

3. function类模板的其他几个member函数

(1) assign函数,为这个函数指针分配一个函数实体。

(2) swap函数,交换两个函数指针拥有的东西

(3) target函数,测试本函数指针指向的函数类型是不是为指定类型

(4) target_type函数,获取函数指针指向的函数的类型信息

不常用,也不好用,所以了解即可。

总结:其实function和函数指针很像,只是比函数指针能多指向一些特别的函数而已。

普通函数指针只能指向普通的外部函数

Function可以指向:外部函数,类的static函数,类的非static函数,类的virtual函数,类的对象(函数对象)。

Tr1 Function相关推荐

  1. c语言prog.c: in function 'main':,C语言 tr1 :: function和tr1 :: bind

    我将以下内容放入Ideone.com(和codepad.org): #include #include #include struct A { A(const std::string& n) ...

  2. C++之TR1::function

    Tr1::function的介绍 它是一个类模板,类的成员变量是一个函数指针.可以把它看作一个智能函数指针(和shared_ptr智能指针对比着理解). 一. 头文件 #include<func ...

  3. C++中std::tr1::function和bind 组件的使用

    在C++的TR1中(Technology Report)中包含一个function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类的非静态成员函 ...

  4. c语言中TR1=1什么意思,c – 如何在Visual Studio 2010(tr1 :: function)中使用tr1?

    如何开始使用Visual Studio 2010的tr1功能?对于更具体的情况,我需要std :: tr1 :: function.我试过包括#include< tr1 / functional ...

  5. std::tr1::function and std::tr1::bind

    std::tr1::function and std::tr1::bind 每日一话 一本正经的胡说八道 引言 在C++的TR1中(Technology Report)中包含一个function模板类 ...

  6. std::tr1::function

    转自:https://www.cnblogs.com/qlee/archive/2011/07/04/2097594.html 在C++的TR1中(Technology Report)中包含一个fun ...

  7. 实现函数指针的功能,tr1::bind,tr1::function,virtual函数重载

    直接上例子,参考Effective c++ 和 https://blog.csdn.net/chdhust/article/details/8006601 #include <iostream& ...

  8. 使用tr1的bind函数模板

    最近把公司的VS2008统一升级为SP1了,虽然还是有些跟不上时代,毕竟C++17标准都出了,但是,对于成熟的商业软件开发而言,追求更新的C++标准肯定不是正道.升级SP1的VS2008可以支持TR1 ...

  9. 使用std::function 把类成员函数指针转换为普通函数指针

    前言 这是改造前一篇 设计模式  的基础,使通知者不必知道观察者的类名和函数名,只需要知道更新函数的原型即可. 开发环境:WIN7 32位 + VS2010 发现在VS2005中使用std::funt ...

最新文章

  1. 各数据结构算法时间复杂度图【笔记自用】
  2. kafka-topics.sh topic主题crud
  3. 苏州宾馆管理也计算机哪个学校好,苏州十大寄宿式中学学校排名榜
  4. ubuntu 下mongodb安装
  5. 交换排序之冒泡排序(java实现)
  6. kdj值应用口诀_KDJ买卖绝学!背熟它短线选股不用愁
  7. 我已经弃用头条了,难道还要抛弃微信?
  8. Bitdefender Total Security 2014 Free 6 Months 12 month License Key
  9. SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())
  10. tbopen链接生成工具_筛选了100个配色工具后,我挑出了这25个
  11. 单片机步进电机正反转C语言程序,单片机控制步进电机正反转
  12. 用计算机信息术语感恩老师,感谢师恩、感恩老师的对联
  13. React Native 微博登陆
  14. 2018在职计算机科学硕士申请,2018年哪些学校计算机在职研究生专业比较好
  15. 软考高级-系统架构设计师经验分享
  16. 四象限变频器技术介绍
  17. Warshall沃舍尔算法
  18. 机房部署以及机房环境
  19. 车联网平台介绍(一)
  20. 复旦大学郁喆隽:网络制造出人的“幻象”,深度思考如何可能?

热门文章

  1. 网站流量的算法是怎么算的?网站每月10G流量够用吗
  2. 【UML之宏观了解】
  3. linux下eeprom读写测试,本科毕业设计__基于linux的eeprom的读写控制.doc
  4. Queue接口分析:add和offer区别,remove和poll方法到底啥区别
  5. QQ邮箱疯狂的附件:别人笑我太疯癫 我笑别人看不穿
  6. 高斯公式(三重积分和第二类曲面积分互相转换)
  7. uniapp uniCloud 云开发上传图片与查看图片
  8. 将生成的视频保存到相册
  9. socks5代理IP的几种测试工具
  10. 故宫夜景门票最高炒至9999元 官方:二手票难以入场