在没有C++11的std::function和std::bind之前,我们使用函数指针的方式是五花八门,结构很繁琐难懂。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。

1.std::function简介

std::function首先是可调用对象,本质上生成了一个类(仿函数)

简单的使用如下代码

#include <unordered_map>
#include <iostream>
#include <functional>
using namespace std;
int func(int a)
{
cout << a << __FUNCTION__ << endl;
return a;
}
int main()
{
using NewType = function<int(int)>; // function本质上生成了一个类(仿函数)
NewType f1 = func;
f1();
return ;
}

2.std::function与std::bind联合使用绑定类成员函数

可将std::bind函数看作一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

std::bind将可调用对象与其参数一起进行绑定,绑定后的结果可以使用std::function保存。std::bind主要有以下两个作用:

  • 将可调用对象和其参数绑定成一个防函数;

  • 只绑定部分参数,减少可调用对象传入的参数。

一个简单的例子:

#include <unordered_map>
#include <iostream>
#include <functional>
using namespace std;
class A
{
public:
int funcA(int a)
{
cout << "111 " << a << endl;
return ;
}
}; int main()
{
A a;
using NewType = function<int(int)>; // function本质上生成了一个类(仿函数)
NewType f1 = bind(&A::funcA, &a, std::placeholders::_1);
f1();
return ;
}

3.std::function与std::bind联合使用绑定类成员重载函数

绑定类成员重载函数的难点在于如何区分函数绑定的是哪一个成员函数。这时需要在函数指针前指定其类型。下面是一个简单的例子:

#include <unordered_map>
#include <iostream>
#include <functional>
using namespace std;
class A
{
public:
int funcA(int a)
{
cout << "111 " << a << endl;
return ;
}
int funcA(int a, int b)
{
cout << "222 " << a << endl;
return a + b;
}
}; int main()
{
unordered_map<int, void *> funcMap;//尝试将其转载入map中
A g;
using NewType1 = function<int(int, int)>;
using NewType2 = function<int(int)>;
NewType1* type1 = new NewType1; // function本质上生成了一个类(仿函数)
NewType2* type2 = new NewType2;
//获取重载函数指针
*type1 = std::bind((int(A::*)(int, int)) & A::funcA, &g, std::placeholders::_1, std::placeholders::_2);
*type2 = std::bind((int(A::*)(int)) & A::funcA, &g, std::placeholders::_1);
//
funcMap[] = type1; //
funcMap[] = type2; // // 使用
void* s1 = funcMap[];
void* s2 = funcMap[];
NewType1* f1 = (NewType1*)(s1);
NewType2* f2 = (NewType2*)(s2);
(*f1)(,);
(*f2)();
return ;
}

最近在工作中,遇到了需要编写大量重复代码的工作,于是尝试将这些重载函数放入映射中,只需要添加注册函数,最终可以统一使用映射表调用所需要的函数,function与bind方法给了我帮助,我也将代码分享给大家。

C++类重载函数的function和bind使用的更多相关文章

  1. JavaScript 函数绑定 Function.prototype.bind

    ECMAScript Edition5 IE9+支持原生,作用为将一个对象的方法绑定到另一个对象上执行. Function.prototype.bind = Function.prototype.bi ...

  2. C++11的闭包(lambda、function、bind)

    c++11开始支持闭包,闭包:与函数A调用函数B相比较,闭包中函数A调用函数B,可以不通过函数A给函数B传递函数参数,而使函数B可以访问函数A的上下文环境才可见(函数A可直接访问到)的变量:比如: 函 ...

  3. C++ 类的成员函数指针 ( function/bind )

    这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...

  4. boost::function 通过boost::bind调用类成员函数

    1. 首先引用boost::function和boost::bind的头文件和库: #include "boost/bind.hpp" #include "boost/f ...

  5. 利用C++11的function和bind简化类创建线程

    问题引出 当在类中需要创建线程时,总是因为线程函数需要定义成静态成员函数,但是又需要访问非静态数据成员这种需求,来做若干重复性的繁琐工作.比如我以前就经常定义一个静态成员函数,然后定一个结构体,结构体 ...

  6. C++ - 模板类模板成员函数(member function template)隐式处理(implicit)变化

    模板类模板成员函数(member function template)隐式处理(implicit)变化 本文地址: http://blog.csdn.net/caroline_wendy/articl ...

  7. C++ Templates (1.5 重载函数模板 Overloading Function Templates)

    返回完整目录 目录 1.5 重载函数模板 Overloading Function Templates 1.5 重载函数模板 Overloading Function Templates 和普通函数一 ...

  8. 重载运算符:类成员函数or友元函数

    类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...

  9. C++类成员函数的重载、覆盖和隐藏区别?

    C++类成员函数的重载.覆盖和隐藏区别? a.成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.b.覆盖是指派生类函数覆 ...

随机推荐

  1. 一个简单的CPP处理框架

    好久没有在csdn上写过东西了,这么多年,一方面是工作忙,下班到家也没有开过电脑了,要陪小孩玩: 下面分享一段代码,是用CPP做的一个简单的消息(协议)处理框架: 是通过成员函数指针+map来实现的: ...

  2. 基于OpenSIPS做注册服务下,场景A打B,一方发起BYE挂断后收到500,另一方无法挂断的问题

    基于OpenSIPS做注册服务下,场景A打B,一方发起BYE挂断后收到500,另一方无法挂断的问题     最近在工作中遇到一个看似很奇怪的,排除起来很费劲,但最后的解决方式又及其简单的问题,下面我们 ...

  3. 2020-07-14:es用过冷热分离吗?假如现在有些数据热变冷,有些数据冷变热,怎么解决?

    福哥答案2020-07-14: 热变冷: 有x台机器tag设置为hot. 有y台机器tag设置为cool. hot集群中只存最近两天的. 有一个定时任务每天将前一天的索引标记为cool. es看到有新 ...

  4. 下面POM插件的作用是转换包名,修改tomcat跳转端口

    <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat6-mave ...

  5. GUAVA-ListenableFuture实现回调

    随着软件开发的不断进步,在实际的开发应用中,可能一次请求需要查询若干次数据库或者调用若干次第三方,按照传统的串行执行的话,会大大增加响应时间,无法满足业务需求,更无法满足用户迫切需要响应迅速的愿望.对 ...

  6. 一键打开 jupyter

    一般打开jupyter notebook 是以下步骤: 打开cmd-----输入:jupyter notebook-----按Enter键 为了省事,写了一个.py文件实现上述步骤,代码如下: imp ...

  7. Android Studio 代码回退

    1.VCS–Local History–Show History 或者 这个按钮 2.代码操作记录出现了,选定我们操作的一个历史阶段 3.点击左上角的按钮(revert),代码回退成功

  8. 用C++写一个电话通讯录

    目前我也是名初学C++的菜鸟,一直在B站上看的C++的网课,这个的C++电话通讯录是我写的第一个有一些功能的代码,所以在这里想分享给初学C++的小白们,如有任何问题或是建议可以在下方评论或是私信我,下 ...

  9. yum安装软件时,提示No package netstat available.的解决方法

    1. 序言 如笔者在本机上运行netstat时,提示没有这个命令,向来简单粗暴,直接yum -y install netstat,显然是不能正常安装的. [root@hadoop-103 ~]# yu ...

  10. MapReduce框架原理

    MapReduce框架原理 3.1 InputFormat数据输入 3.1.1 切片与MapTask并行度决定机制 1.问题引出 MapTask的并行度决定Map阶段的任务处理并发度,进而影响到整个J ...