C++11中的std::function


 

原文地址:http://www.jellythink.com/archives/771

看看这段代码

先来看看下面这两行代码:

std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed;
std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased;

 

这两行代码是从Cocos2d-x中摘出来的,重点是这两行代码的定义啊。std::function这是什么东西?如果你对上述两行代码表示毫无压力,那就不妨再看看本文,就当温故而知新吧。

std::function介绍

类模版std::function是一种通用、多态的函数封装。std::function的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括普通函数、Lambda表达式、函数指针、以及其它函数对象等。std::function对象是对C++中现有的可调用实体的一种类型安全的包裹(我们知道像函数指针这类可调用实体,是类型不安全的)。

通常std::function是一个函数对象类,它包装其它任意的函数对象,被包装的函数对象具有类型为T1, …,TN的N个参数,并且返回一个可转换到R类型的值。std::function使用 模板转换构造函数接收被包装的函数对象;特别是,闭包类型可以隐式地转换为std::function

最简单的理解就是:

通过std::function对C++中各种可调用实体(普通函数、Lambda表达式、函数指针、以及其它函数对象等)的封装,形成一个新的可调用的std::function对象;让我们不再纠结那么多的可调用实体。一切变的简单粗暴。

怎么使用std::function

使用std::function的感觉就是“万众归一”,下面就通过实际的代码例子,看看究竟怎么使用std::function。会使用了才是王道。

复制代码
#include <functional>
#include <iostream>
using namespace std;std::function< int(int)> Functional;// 普通函数
int TestFunc(int a)
{return a;
}// Lambda表达式
auto lambda = [](int a)->int{ return a; };// 仿函数(functor)
class Functor
{
public:int operator()(int a){return a;}
};// 1.类成员函数
// 2.类静态函数
class TestClass
{
public:int ClassMember(int a) { return a; }static int StaticMember(int a) { return a; }
};int main()
{// 普通函数Functional = TestFunc;int result = Functional(10);cout << "普通函数:"<< result << endl;// Lambda表达式Functional = lambda;result = Functional(20);cout << "Lambda表达式:"<< result << endl;// 仿函数
    Functor testFunctor;Functional = testFunctor;result = Functional(30);cout << "仿函数:"<< result << endl;// 类成员函数
    TestClass testObj;Functional = std::bind(&TestClass::ClassMember, testObj, std::placeholders::_1);result = Functional(40);cout << "类成员函数:"<< result << endl;// 类静态函数Functional = TestClass::StaticMember;result = Functional(50);cout << "类静态函数:"<< result << endl;return 0;
}
复制代码

 

对于各个可调用实体转换成std::function类型的对象,上面的代码都有,运行一下代码,阅读一下上面那段简单的代码。总结了简单的用法以后,来看看一些需要注意的事项:

  • 关于可调用实体转换为std::function对象需要遵守以下两条原则:
    • 转换后的std::function对象的参数能转换为可调用实体的参数;
    • 可调用实体的返回值能转换为std::function对象的返回值。
  • std::function对象最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等,但是可以与NULL或者nullptr进行比较。

为什么要用std::function

好用并实用的东西才会加入标准的。因为好用,实用,我们才在项目中使用它。std::function实现了一套类型消除机制,可以统一处理不同的函数对象类型。以前我们使用函数指针来完成这些;现在我们可以使用更安全的std::function来完成这些任务。

还有为什么?我也不知道还有为什么?等以后发现了更好的实际应用实例再回来说为什么吧。

总结

C++11的加入,貌似让C++变了一个语言似的,也有了Lambda表达式,好多东西都要去学习,好多新的语言特性。哦,慢慢来吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HDU - 3394】Railway(点双连通分量,Tarjan算法,思维tricks)

题干&#xff1a; There are some locations in a park, and some of them are connected by roads. The park manger needs to build some railways along the roads, and he would like to arrange tourist routes to each circuit. If a railway belongs to more than one …

飞机大战(简易版)

一、游戏分析 飞机大战中的主要“角色”有&#xff1a; 1.英雄 2.敌方飞机 3.英雄发射的子弹 我们需要控制的有&#xff1a; 1.绘制屏幕内的角色 2.控制角色的逻辑&#xff0c;比如&#xff1a;敌方飞机与我方飞机的碰撞检测&#xff0c;我方飞机发射的子弹与敌方飞机之间的碰撞…

在Ubuntu上安装Keras深度学习框架

目录 1&#xff09;安装pip 2&#xff09;安装Python科学套件 3&#xff09;安装TensorFlow 4&#xff09;安装keras 5&#xff09;安装Jupyter Notebook 6&#xff09;运行Keras 本文介绍如何在Ubuntu上安装Keras深度学习框架。 1&#xff09;安装pip 安装pip包&#…

【POJ - 1523】SPF(Tarjan求割点,求分割成的连通块数,模板题,tricks)

题干&#xff1a; Consider the two networks shown below. Assuming that data moves around these networks only between directly connected nodes on a peer-to-peer basis, a failure of a single node, 3, in the network on the left would prevent some of the still…

C++11 FAQ中文版:std::function 和 std::bind

std::function 和 std::bind 标准库函数bind()和function()定义于头文件中&#xff08;该头文件还包括许多其他函数对象&#xff09;&#xff0c;用于处理函数及函数参数。bind()接受一个函数&#xff08;或者函数对象&#xff0c;或者任何你可以通过”(…)”符号调用的事物&am…

Java 习题(面向对象)

1.&#xff08;面向对象基础&#xff09;写一个Worker 类&#xff0c;并创建多个Worker 对象。 为Worker 类添加四个属性&#xff0c; <1>int 类型的id&#xff0c;表示工人的编号&#xff1b; <2>String 类型的name&#xff0c;表示工人的姓名&#xff1b; <3…

机器学习笔记(2):单变量线性回归

目录 1&#xff09;Model representation 2&#xff09;Cost function 3&#xff09;Cost function intuition 1 4&#xff09;Cost function intuition2 5&#xff09;Gradient descent 6&#xff09;Gradient descent intuition 7&#xff09;Gradient descent for li…

指针右左法则----复杂指针解析

其实如果写得出&#xff08;其实不难&#xff09;指针和数组的声明的EBNF的话&#xff0c;那么直接看就可以反应过来了…… 右左法则是一个既著名又常用的方法。不过&#xff0c;右左法则其实并不是C标准里面的内容&#xff0c;它是从C标准的声明规定中归纳出来的方法。C标准的…

【POJ - 3694】Network(对dfn求lca 或 缩点+lca 或 边双连通+并查集)

题干&#xff1a; 网络管理员管理大型网络。该网络由N台计算机和成对计算机之间的M链路组成。任何一对计算机都通过连续的链接直接或间接连接&#xff0c;因此可以在任何两台计算机之间转换数据。管理员发现某些链接对网络至关重要&#xff0c;因为任何一个链接的故障都可能导…

安装VMware tools

点击“虚拟机” 安装VMware tools提取图中文件到“下载” 提取登入root 进入 cd 下载/vmware-tools-distrib 执行 ./vmware-install-pl 输入yes或者点击“enter”出现图中&#xff0c;即为成功安装

Keras入门实战(1):MNIST手写数字分类

目录 1)首先我们加载Keras中的数据集 2&#xff09;网络架构 3&#xff09;选择编译(compile参数) 4&#xff09;准备图像数据 5) 训练模型 6&#xff09;测试数据 前面的博客中已经介绍了如何在Ubuntu下安装Keras深度学习框架。 现在我们使用 Keras 库来学习手写数字分…

什么是BNF EBNF 巴科斯范式及其扩展 BNF Augmented BNF

什么是BNF范式,什么又是EBNF范式? 巴科斯范式及其扩展 BNF & Augmented BNF 什么是巴科斯范式&#xff1f;   巴科斯范式(BNF: Backus-Naur Form 的缩写)是由 John Backus 和 Peter Naur 首先引入的用来描述计算机语言语法的符号集。   现在&…

root 进入ssh 出现问题

用root输入下面命令&#xff0c;一直让输入密码&#xff0c;并提示错误 ssh localhost那是因为系统默认禁止root用户登录ssh 首先&#xff0c;CtrlC退出密码输入界面&#xff1a;然后输入&#xff1a;su - 然后&#xff0c;编辑sshd_config文件&#xff0c;输入&#xff1a;…

【BZOJ - 2574】[Poi1999] Store-Keeper(点双连通分量,求割点,记忆化bfs)

题干&#xff1a; 有一个仓库被分成n*m 个矩形区域&#xff0c;如果两个区域有一条公共边&#xff0c;则被认为这两个区域相邻。包裹都放在一个区域中&#xff0c;剩余的区域或者空闲或者被集装箱占有&#xff0c;这是因为集装箱太重&#xff0c;仓库管理员不能将集装箱搬走。…

机器学习笔记(3):线性代数回顾

目录 1&#xff09;Matrices and vectors 2&#xff09;Addition and scalar multiplication 3&#xff09;Matrix-vector multiplication 4&#xff09;Matrix-matrix multiplication 5&#xff09;Matrix multiplication properties 6&#xff09;Inverse and transpos…

hadoop 安装

Hadoop单机和伪分布式安装 更新apt 用root用户登录 先更新一下 apt apt-get update然后安装vim apt-get install vim安装VMware tools tools 安装 安装SSH、配置SSH无密码登陆 单节点模式都需要用到 SSH 登陆&#xff0c;Ubuntu 默认已安装了 SSH client&#xff0c;此…

机器学习笔记(4):多变量线性回归

目录 1&#xff09;Multiple Features 2&#xff09;Gradient descent for multiple variables 3&#xff09;Gradient descent in practice 1: Feature Scaling 4&#xff09;Gradient descent in pratice2: Learning rate 5&#xff09;Features and polynomial regress…

【POJ - 2942】Knights of the Round Table(点双连通分量,二分图判断奇环奇圈)

题干&#xff1a; Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress, and drinking with the other knights are fun things to do. Therefore, it is not very surprising that in recent years the kingdom of King …

zookeeper单节点部署

hadoop 安装 在/install-package目录下查看zookeeper的安装包 本文中安装的是zookeeper-3.4.12.tar.gz 下方为百度云链接 链接&#xff1a;https://pan.baidu.com/s/1bzq4ILH41owtS__3tBCcRQ 提取码&#xff1a;6q4r 把下载好的zookeeper-3.4.12.tar.gz 放到/install-packa…

机器学习笔记(五):逻辑回归

目录 1&#xff09;Classification 2&#xff09;Hypothesis Representation 3&#xff09;Decision boundary 4&#xff09;Cost function 5&#xff09;Simplified cost function and gradient descent 6&#xff09;Multi-class classification:One-vs-all 7&#xf…