C++ std::function详解

目录
  • 一、介绍
  • 二、实例
  • 三、与std::bind的区别
  • 总结

一、介绍

std::function是函数模板类(是一个类)。包含在#include <functional> 中。以前没有这个类的时候,我们在想定义一个回调函数指针,非常的麻烦。我们通常这样的定义:

typedef  void(*ptr)(int,int)// 这里的ptr就是一个函数指针

而使用了std::function这个类的时候,我们可以这样使用,来替换函数指针。例如:

std::function<void(int ,int)> func;

std::function 的实例能存储、复制及调用任何可调用 (Callable) 目标——函数、 lambda 表达式、 bind 表达式或其他函数对象,还有指向成员函数指针和指向数据成员指针。

它也是对 C++ 中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的)

二、实例

    #include <iostream>
    #include <vector>
    #include <list>
    #include <map>
    #include <set>
    #include <string>
    #include <algorithm>
    #include <functional>
    #include <memory>
    using namespace std;
    //声明一个模板
    typedef std::function<int(int)> Functional;
    //normal function
    int TestFunc(int a)
    {
        return a;
    }
    //lambda expression
    auto lambda = [](int a)->int{return a;};
    //functor仿函数
    class Functor
    {
    public:
        int operator() (int a)
        {
            return a;
        }
    };
    //类的成员函数和类的静态成员函数
    class CTest
    {
    public:
        int Func(int a)
        {
            return a;
        }
        static int SFunc(int a)
        {
            return a;
        }
    };
    int main(int argc, char* argv[])
    {
        //封装普通函数
        Functional obj = TestFunc;
        int res = obj(0);
        cout << "normal function : " << res << endl;
        //封装lambda表达式
        obj = lambda;
        res = obj(1);
        cout << "lambda expression : " << res << endl;
        //封装仿函数
        Functor functorObj;
        obj = functorObj;
        res = obj(2);
        cout << "functor : " << res << endl;
        //封装类的成员函数和static成员函数
        CTest t;
        obj = std::bind(&CTest::Func, &t, std::placeholders::_1);
        res = obj(3);
        cout << "member function : " << res << endl;
        obj = CTest::SFunc;
        res = obj(4);
        cout << "static member function : " << res << endl;
        return 0;
    }  

运行结果

三、与std::bind的区别

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

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

  • 将可调用对象和其参数绑定成一个仿函数;
  • 只绑定部分参数,减少可调用对象传入的参数。
 double my_divide(double x, double y) { return x / y; };
 int main(int argc, char* argv[])
 {
	 auto fn_half = std::bind(my_divide, std::placeholders::_1, 2);
	 std::cout << fn_half(10) << '\n';                        // 输出为5
	 return 0;
}

参考:

C++ std::function的用法详解

C++11 中的std::function和std::bind详解

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • C++11中lambda、std::function和std:bind详解

    前言 在C++11新标准中,语言本身和标准库都增加了很多新内容,本文只涉及了一些皮毛.不过我相信这些新特性当中有一些,应该成为所有C++开发者的常规装备.本文主要介绍了C++11中lambda.std::function和std:bind,下面来一起看看详细的介绍吧. lambda 表达式 C++11中新增了lambda 表达式这一语言特性.lambda表达式可以让我们快速和便捷的创建一个"函数". 下面是lambda表达式的语法: [ capture-list ] { body }

  • C++ std::function的用法详解

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

  • C++11 学习笔记之std::function和bind绑定器

    std::function C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法五花八门.为了统一泛化函数对象,函数指针,引用函数,成员函数的指针的各种操作,让我们可以按更统一的方式写出更加泛化的代码,C++11推出了std::function. std::function是可调用对象的包装器.它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象.通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指针,并允许保存和延迟

  • C++ STL 内 std::{bind/tuple/function} 简单实现

    基本逻辑思考 首先是实现 function,这个比较简单,重载 operator() 就好,这里只实现对函数指针的包装 其次是实现 tuple,这个会比较绕,通过模板取第一个参数,然后用剩下的参数继续生成  tuple并继承,是一种递归的思想 有了 tuple 就要有 get(),这个就更比较绕了,首先是需要类似的方式实现获得 tuple 的值类型与元组类型,然后通过强制类型转换,获取对应的层级的 value 接下来是 bind,首先要解决的就是如何保存创建时的参数列表,这里就用到 tuple

  • 理解C++编程中的std::function函数封装

    先来看看下面这两行代码: std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed; std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased; 这两行代码是从Cocos2d-x中摘出来的,重点是这两行代码的定义啊.std::function这是什么东西?如果你对上述两行代码表示毫无压力,那就不妨再看看本文,就当温故而知新吧. std::

  • C++ 11 std::function和std::bind使用详解

    cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码: auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); 2.0内的代码用的不是CC_CALLBACK_1而是menu_selector. CC_CALLBACK系列是3.

  • C++ std::function详解

    目录 一.介绍 二.实例 三.与std::bind的区别 总结 一.介绍 std::function是函数模板类(是一个类).包含在#include <functional> 中.以前没有这个类的时候,我们在想定义一个回调函数指针,非常的麻烦.我们通常这样的定义: typedef void(*ptr)(int,int)// 这里的ptr就是一个函数指针 而使用了std::function这个类的时候,我们可以这样使用,来替换函数指针.例如: std::function<void(int

  • javascript 面向对象function详解及实例代码

    javascript 面向对象function详解     js中的函数有三种表示方式: //函数的第一种表示方式:函数关键字的方式 function f1() { alert("f1"); } //函数的第二种表示方式:函数字面量的方式 var f2 = function() { alert("f2"); } //函数的第三种表示方式:构造函数的方式 var f3 = new Function('var a = 100; b = 200; return a+b;'

  • C++11 并发指南之std::mutex详解

    上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文件中,所以如果你需要使用 std::mutex,就必须包含 <mutex> 头文件. <mutex> 头文件介绍 Mutex 系列类(四种) std::mutex,最基本的

  • C++中的std::async()详解

    1.std::async函数原型: template<class Fn, class... Args> future<typename result_of<Fn(Args...)>::type> async(launch policy, Fn&& fn, Args&&...args); 功能:第二个参数接收一个可调用对象(仿函数.lambda表达式.类成员函数.普通函数......)作为参数,并且异步或是同步执行他们. a.对于是异步执行

  • C++11 中的std::function和std::bind详解

    目录 1. 可调用对象 2. std::function 3. std::bind 3.1 std::bind绑定普通函数 3.2 std::bind绑定一个成员函数 3.3 绑定一个引用参数 4. 指向成员函数的指针 总结 1. 可调用对象 可调用对象有一下几种定义: 是一个函数指针,参考 C++ 函数指针和函数类型: 是一个具有operator()成员函数的类的对象: 可被转换成函数指针的类对象: 一个类成员函数指针: C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门

  • C++11 并发指南之std::thread 详解

    上一篇博客<C++11 并发指南一(C++11 多线程初探)>中只是提到了 std::thread 的基本用法,并给出了一个最简单的例子,本文将稍微详细地介绍 std::thread 的用法. std::thread 在 <thread> 头文件中声明,因此使用 std::thread 时需要包含 <thread> 头文件. std::thread 构造 default (1) thread() noexcept; initialization (2) template

  • JavaScript中Function详解

    关键字function用来定义函数. 复制代码 代码如下: //函数声明式定义: function funcname([arg1[,args[...,argn]]]){  statements } //函数表达式定义: var funcname = function ([arg1[,args[...,argn]]]){  statements }; 注意,function语句里的花括号是必需的,即使函数体只包含一条语句. 在JavaScript中,函数是Function类的具体实例.而且都与其它

  • C++11 并发指南之Lock 详解

    在 < C++11 并发指南三(std::mutex 详解)>一文中我们主要介绍了 C++11 标准中的互斥量(Mutex),并简单介绍了一下两种锁类型.本节将详细介绍一下 C++11 标准的锁类型. C++11 标准为我们提供了两种基本的锁类型,分别如下: std::lock_guard,与 Mutex RAII 相关,方便线程对互斥量上锁. std::unique_lock,与 Mutex RAII 相关,方便线程对互斥量上锁,但提供了更好的上锁和解锁控制. 另外还提供了几个与锁类型相关的

随机推荐