C++11之函数对象
1、使用场景
在没有C++11的时候,我们通常使用回调函数来完成某些特定的功能,使用回调函数就需要先声明函数指针
示例:
typedef int(*PFunction)(int);
这里的 PFunction 就是一个函数指针类型,我们可以用它定义函数指针对象,传递到指定位置,用于回调
但C++11的 std::function 出现之后,想要实现上述功能,不再需要函数指针,使用更加简单
使用函数对象需要包含头文件:
#include <functional>
2、函数对象
函数对象通过重载 () 实现
示例:
class MyClass{
public:
int operator()(int a){
return a;
}
}
如上,MyClass 类中重载 () 符号,调用如下:
MyClass myClass;
myClass(12);
myClass 对象就是一个类函数对象
示例:
int TestFunction(int num){
cout<<num<<endl;
}
int TestFunction2(int num){
cout<<num+1<<endl;
}
std::function<int(int)> fun;
fun = TestFunction;
fun(22);//22
fun = TestFunction2;
fun(22);//23
如上,fun 对象就是一个函数对象,它的返回值是 int,需要一个 int 类型的参数
std::function 也可以用在 lambda 上
auto lambda = [](int num, const string& str) -> int {
cout<<str<<endl;
return num;
}
std::function<int(int, const string&)> func = lambda;
func(12, "aaa");
如上例可以看出,std::function 只是保存了函数,使用时仍然需要调用传参
如果希望传递类成员函数,可以使用STL提供的另一种方法: std::bind
3、std::bind
上面的 std::function 定义函数对象,但是没有绑定函数,也没有绑定参数,std::bind 方法返回一个函数对象,绑定参数和函数
示例:
void Function(int num, const string &str)
{
cout << num << " " << str << endl;
}
auto bind = std::bind(Function, 2, "aa");
bind();//2 aa
bind(3, "cc", 11);//2 aa,不会报错,但是参数无效
//使用参数占位符
auto bind2 = std::bind(Function, placeholders::_1, placeholders::_2);
bind2(3, "cc");//3 cc
上例中,bind 对象绑定了函数 Function,以及两个参数,调用时不需要再次传参。也可以使用stl的占位符来预留参数位置
也可以使用成员函数,但是必须且传递的第一个参数必须是对象指针
示例:
class Test
{
public:
Test(int num)
: num(num)
{}
int Function(int n)
{
cout << num << endl;
return num + n;
}
private:
int num;
};
int main()
{
Test test(12);
auto bind = std::bind(&Test::Function, &test, 9);
auto res = bind();
cout << res << endl;
return 0;
}
输出
12
21
4、总结
C++11 的函数对象用在需要使用函数指针的地方,替代之
C++11之函数对象的更多相关文章
- C++11多态函数对象包装器
[C++11多态函数对象包装器] 针对函数对象的多态包装器(又称多态函数对象包装器)在语义和语法上和函数指针相似,但不像函数指针那么狭隘.只要能被调用,且其参数能与包装器兼容的都能以多态函数对象包装器 ...
- C++ 11 - STL - 函数对象(Function Object) (下)
1. 预定义函数对象 C++标准库内含许多预定义的函数对象,也就是内置的函数对象. 你可以充分利用他们,不必自己费心去写一些自己的函数对象. 要使用他们,你只要包含如下头文件 #include < ...
- C++ 11 - STL - 函数对象(Function Object) (上)
1. 定义 在STL中,可以把函数传递给算法,也可以把函数对象传递给算法. 那么,什么是函数对象呢? 我们来看下它的声明: class X { public: // define function c ...
- C++ 11 - STL - 函数对象(Function Object) (中)
我们再来看一个复杂的例子 需求: 我们需要对集合内每个元素加上一个特定的值 代码如下: AddInt.h class AddInt { private: int theValue; // the va ...
- C++11用于计算函数对象返回类型的统一方法
[C++11用于计算函数对象返回类型的统一方法] 模板 std::result_of 被TR1 引进且被 C++11 所采纳,可允许我们决定和使用一个仿函数其回返值的类别.底下,CalculusVer ...
- C++11新特性之八——函数对象function
详细请看<C++ Primer plus>(第六版中文版) http://www.cnblogs.com/lvpengms/archive/2011/02/21/1960078.html ...
- Day 11 函数对象,函数嵌套,作用域,闭包
函数总结 # 函数的定义:def func(a, b): print(a, b) return a + b# 函数四个组成部分# 函数名:调用函数的依据,必须的# 函数体:执行函数逻辑 ...
- javascript 利用匿名函数对象给你异步回调方法传参数
先来创建一个匿名函数对象: /*** * 匿名函数 */ var callChangeBtn=new function(bugBtn){ this.chage=function(json){ bugB ...
- C++11—lambda函数
[1]lambda表达式语法定义 lambda表达式的语法定义如下: [capture] (parameters) mutable ->return-type {statement}; (1) ...
- python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)
1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...
随机推荐
- CH6803 导弹防御塔 (二分 + 匈牙利 / 网络流)
链接:https://ac.nowcoder.com/acm/contest/1062/D 题目描述 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵 ...
- 2017年第八届 蓝桥杯A组 C/C++决赛题解
蓝桥杯历年国赛真题汇总:Here 1. 平方十位数 由0~9这10个数字不重复.不遗漏,可以组成很多10位数字. 这其中也有很多恰好是平方数(是某个数的平方). 比如:1026753849,就是其中最 ...
- docker构建java镜像,运行镜像出现 no main manifest attribute, in /xxx.jar
背景 本文主要是一个随笔,记录一下出现"no main manifest attribute"的解决办法 问题原因 主要是近期在构建一个镜像,在镜像构建成功后,运行一直提示&quo ...
- 假如有一个需求,我们要在一个页面中 ul 标签里渲染 **十万** 个 li 标签
1 // 插入十万条数据 2 const total = 100000; 3 let ul = document.querySelector('ul'); // 拿到 ul 4 5 // 懒加载的思路 ...
- SpringCloud Alibaba Security安全认证
一. Security配置(auth认证中心) 代码地址 https://github.com/typ1805/blog-cloud Spring Security是一套安全框架,可以基于RBAC(基 ...
- Bash 常用命令总结
基础常用命令 某个命令 --h,对这个命令进行解释 某个命令 --help,解释这个命令(更详细) man某个命令,文档式解释这个命令(更更详细)(执行该命令后,还可以按/+关键字进行查询结果的搜索) ...
- java进阶(11)--Arrays工具类
一.工具类介绍: 一般都为static静态方法,可直接调用 二.常用方法: 1.Array.toString() 2.Array.sort() 3.Arrays.binarySearch(),需 ...
- JUC包常用类原理
放眼望去,java.util.concurrent包下类大致包括:atomic 原子类.锁.并发集合.线程池.工具类.我们挑重要的了解一下. Atomic 原子类 Java针对并发编程已经有了各种锁, ...
- 275.H指数II
1.题目介绍 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 .计算并返回该研究者的 h 指数. ...
- 使用阿里canal实现mysql与Elasticsearch增量同步
一.背景介绍 最近在做一个地理信息相关的项目,需要维护大量的地址描述数据,同时需要提供对数据检索的功能,准备采用Elasticsearch(6.7)实现.那么问题就来了,地址数据需要同时在MySQL和 ...