C++11 std::function、std::bind和lambda表达式
参考博客: C++可调用对象详解-https://www.cnblogs.com/Philip-Tell-Truth/p/5814213.html
一、关于std::function与std::bind
翻看了几篇博客,还不如看书逻辑性好。以下内容摘自祁宇《深入应用C++11: 代码优化与工程级应用》一书。
有以下4种情况可被称为可调用对象。
1、是一个函数指针。(这里的函数要求是如C函数一样的编译期内存确定的函数指针)
2、是一个具有operator()成员函数的类对象。(让类重载调用操作符operator(),关键在于是以类对象调用形式调用)
3、是一个可被转换为函数指针的类对象。(这一点与2是一样的,函数可以使用函数名+operator的形式调用,也可以使用函数指针如 void(*p)(int); p = test;
(*p) (n); 注意看下面例子中的这一种情况)
4、是一个类成员(函数)指针。
例子:
void func( void) { // ... }
struct Foo {
void operator()( void) { // ... }
};
struct Bar {
using fr_ t = void(*)( void); //void (*)(void)相当定义了一种函数指针类型!!!
static void func( void) { // ... } //一定要是static
operator fr_ t( void) { return func; }
};
struct A{
int a_;
void mem_ func( void) { // ... }
};
使用:
int main( void) {
void(* func_ ptr)( void) = &func; // 1. 函数 指针
func_ ptr();
Foo foo; // 2. 仿 函数
foo();
Bar bar; // 3. 可被 转换 为 函数 指针 的 类 对象
bar();
void (A::* mem_ func_ ptr)( void)= &A:: mem_ func; // 4. 类 成员 函数 指针
int A::* mem_ obj_ ptr = &A:: a_; // 或者是 类 成员 指针
A aa;
(aa.* mem_ func_ ptr)();
aa.* mem_ obj_ ptr = 123;
return 0;
}
std::function是可调用对象的包装器(也就是说std::function对上面几种情况做了封装),可以容纳除了类成员(函数)指针外(不包括上面列出来的4!)的所有可调用对象。通过制定它的模板参数,它可以用统一的方式处理函数、函数对象、函数指针,并允许保存于延迟执行他们。
如定义 std::function<void (void)> fc = func; fc(); //等同于调用func
std::function包括了C++中的可调用对象,让上述列出来的签3中情况就有了一个方便操作的对象属性。
std::bind可以让上面的第4中情况也变成一个方便使用的std::function对象,C++中函数指针的使用一定要上调用者对象。
如下代码:
#include < iostream>
#include < functional>
class A {
public:
int i_ = 0;
void output( int x, int y) { std:: cout << x << " " << y << std:: endl;}
};
int main( void)
{
A a;
std:: function< void( int, int)> fr = std:: bind(& A:: output, &a, std:: placeholders::_ 1 , std:: placeholders::_ 2);
fr( 1, 2);
}
针对类成员函数指针,std::bind就填入了调用者a的地址值,使它变成了一个方便易用的std::function对象。
二、lambda表达式
语法:[ capture ] ( params ) opt -> ret { body; };
其中最有意思的应该是capture这个属性了吧。有空来补充吧,吃饭去!
C++11 std::function、std::bind和lambda表达式的更多相关文章
- C++11 中function和bind以及lambda 表达式的用法
关于std::function 的用法: 其实就可以理解成函数指针 1. 保存自由函数 void printA(int a) { cout<<a<<endl; } std:: ...
- 【转载】C++ function、bind和lambda表达式
本篇随笔为转载,原贴地址:C++ function.bind和lambda表达式. 本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制 ...
- c++11——std::function和bind绑定器
c++11中增加了std::function和std::bind,可更加方便的使用标准库,同时也可方便的进行延时求值. 可调用对象 c++中的可调用对象存在以下几类: (1)函数指针 (2)具有ope ...
- C++11 学习笔记 std::function和bind绑定器
C++11 学习笔记 std::function和bind绑定器 一.std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法 ...
- c++11新标准for循环和lambda表达式
:first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...
- C++ 11 std::function std::bind使用
cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码: auto closeItem = MenuItemImage::create( "CloseNorm ...
- C++11学习笔记之三lamda表达式,std::function, std::bind
//lamda //first lamda [] {}; // second lamda []() //or no need () when paramater is null { std::cout ...
- C++11 中的function和bind、lambda用法
std::function 1. std::bind绑定一个成员函数 #include <iostream> #include <functional> struct Foo ...
- std::function,std::bind复习
#include <iostream> #include <functional>//std::bind返回函数对象 void fun1(int a, int b) { std ...
随机推荐
- [kubernetes] 使用 Minikube 快速搭建本地 k8s 环境 (基于 Docker 驱动模式)
一.实验环境 操作系统:Centos 7 x86_64 Docker:1.12.6 二.部署 k8s 步骤 2.1 安装 kubectl cat <<EOF > /etc/yum. ...
- BZOJ 2595 [Wc2008]游览计划 ——斯坦纳树
[题目分析] 斯坦纳树=子集DP+SPFA? 用来学习斯坦纳树的模板. 大概就是用二进制来表示树包含的点,然后用跟几点表示树的形态. 更新分为两种,一种是合并两个子集,一种是换根,换根用SPFA迭代即 ...
- 关于java读取文件IO流学习总结(二)
今天网上随意逛了逛,某处看到关于文件的操作,描述的不错,加深了对于文件操作的理解,在此分享给大家.希望能够有所收获. java读取txt文件内容: 可以作如下理解: 1. 首先获得一个文件句柄.Fil ...
- 【bzoj4568】【Scoi2016】幸运数字 (线性基+树上倍增)
Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一 ...
- Codevs 2801 LOL盖伦的蹲草计划
题目描述 Description 众所周知,LOL这款伟大的游戏,有个叫盖伦的英雄.他的伟大之处在于他特别喜欢蹲草丛阴人(XL:蹲草阴人也算英雄?!CZQ:没办法,个个都是这么玩的).某日,德玛西亚与 ...
- msp430项目编程43
msp430综合项目---蓝牙控制直流电机调速系统43 1.电路工作原理 2.代码(显示部分) 3.代码(功能实现) 4.项目总结
- centos7 搭建hadoop
参考文档:http://blog.csdn.net/xiaoxiangzi222/article/details/52757168 https://waylau.com/centos-7-instal ...
- 【WEB基础】HTML & CSS 基础入门(6)超链接
超链接--文字链接 超链接[hyperlink]是网页中最为常见的元素之一,我们几乎可以在所有的网站页面中找到超链接.每个网站都不止一个页面,这些页面就是利用超链接进行串接.超链接帮我们实现了网页与网 ...
- pandaboard安装ubuntu14.04系统遇到的问题
按照该网址步骤安装https://www.eewiki.net/display/linuxonarm/PandaBoard 在linux kernel的./build_kernel.sh时,自动安装交 ...
- Spring的IoC容器-Spring BeanFactory容器
虽然这个方法已经在3.1之后已经弃用了,但是可以了解一下. 在Spring中,有大量对BeanFactory接口的实现.其中,最常被使用的是XmlBeanFactory类.这个容器从一个XML文件中读 ...