`
haoningabc
  • 浏览: 1477826 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c++11的function和bind

    博客分类:
  • c
c++ 
阅读更多
参考:https://www.cnblogs.com/bencai/p/9124654.html

使用g++ -std=c++11 some.cpp 编译

c++的helloworld
#include <iostream>
using namespace std;
int main(int argc,char **argv)
{
    cout<<"hello world!"<<endl;
    auto i=10;
    cout<<i<<endl;
    return 0;
}


function的用法
注意使用头文件<functional>
#include <iostream>
#include <functional>
using namespace std;
void printA(int a)
{
     cout << a << endl;
}

int main()
{
    std::function<void(int a)> func;
    func =  printA;
    func(2);   //2
    printf("Hello world");
    puts("Hello world");
    cout << "Hello world" << endl;
    return 0;
}


lambda
#include <iostream>
#include <functional>
using namespace std;
void printA(int a)
{
     cout << a << endl;
}

int main()
{
    std::function<void()> func_1 = [](){cout << "hello world lamda" << endl;};
    func_1();  //hello world
    cout << "Hello world" << endl;
    return 0;
}


代替对象的成员函数,成员函数需要是public
#include <iostream>
#include <functional>
using namespace std;
class Foo{
    public:
    	Foo(int num) : num_(num){}
    	void print_add(int i) const {cout << num_ + i << endl;}
    	int num_;
};
int main()
{
    std::function<void(const Foo&,int)> f_add_display = &Foo::print_add;
    Foo foo(2);
    f_add_display(foo,1);
    cout << "Hello world" << endl;
    return 0;
}



结合bind的例子
placeholders的概念
关于bind的用法:

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

调用bind的一般形式:auto newCallable = bind(callable,arg_list);

#include <iostream>
#include <functional>
using namespace std;
class A
{
public:
    void fun_3(int k,int m)
    {
        cout<<k<<" "<<m<<endl;
    }
};

void fun(int x,int y,int z)
{
    cout<<x<<"  "<<y<<"  "<<z<<endl;
}

void fun_2(int &a,int &b)
{
    a++;
    b++;
    cout<<a<<"  "<<b<<endl;
}

int main(int argc, const char * argv[])
{
    //f1的类型为 function<void(int, int, int)>
    auto f1 = std::bind(fun,1,2,3); //表示绑定函数 fun 的第一,二,三个参数值为: 1 2 3
    f1(); //print:1  2  3

    auto f2 = std::bind(fun, placeholders::_1,placeholders::_2,3);
    //表示绑定函数 fun 的第三个参数为 3,而fun 的第一,二个参数分别由调用 f2 的第一,二个参数指定
    f2(1,2);//print:1  2  3

    auto f3 = std::bind(fun,placeholders::_2,placeholders::_1,3);
    //表示绑定函数 fun 的第三个参数为 3,而fun 的第一,二个参数分别由调用 f3 的第二,一个参数指定
    //注意: f2  和  f3 的区别。
    f3(1,2);//print:2  1  3


    int n = 2;
    int m = 3;

    auto f4 = std::bind(fun_2, n,placeholders::_1); //表示绑定fun_2的第一个参数为n, fun_2的第二个参数由调用f4的第一个参数(_1)指定。
    f4(m); //print:3  4

    cout<<m<<endl;//print:4  说明:bind对于不事先绑定的参数,通过std::placeholders传递的参数是通过引用传递的,如m
    cout<<n<<endl;//print:2  说明:bind对于预先绑定的函数参数是通过值传递的,如n


    A a;
    //f5的类型为 function<void(int, int)>
    auto f5 = std::bind(&A::fun_3, a,placeholders::_1,placeholders::_2); //使用auto关键字
    f5(10,20);//调用a.fun_3(10,20),print:10 20

    std::function<void(int,int)> fc = std::bind(&A::fun_3, a,std::placeholders::_1,std::placeholders::_2);
    fc(10,20);//调用a.fun_3(10,20) print:10 20

    return 0;
}
分享到:
评论

相关推荐

    C++中function和bind是如何实现的

    C++里面的function是一个非常奇妙的东西,但是你想过他是如何实现的吗?作者在深刻理解了其中奥妙之后写就的精简版本。而且可以避免STL里面的function无法和Socket编程一起使用的问题——bind会无法正确解析。

    通过c++11的std::bind及std::function实现类方法回调,模拟Qt实现信号槽

    c++11引入了std::bind及std::function,实现了函数的存储和绑定,即先将可调用的对象保存起来,在需要的时候再调用。定义了SignalObject信号类和SlotObject槽类,其中信号类中的 std::function(int)&gt; _call就是要...

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

    C++ 11 std::function和std::bind使用详解 C++ 11 中引入了两个重要的功能:std::function 和 std::bind,它们都是基于 C++ 11 的新特性,用于实现函数指针的功能。下面将详细介绍这两个功能的使用和区别。 std::...

    C++ function、bind以及lamda表达式

    C++0x引入了多项新特性,其中lambda表达式、std::function对象和bind机制是提升代码灵活性和可读性的重要工具。这三者之间的紧密联系在于它们都能在处理回调函数时提供便利。 1. **std::function** std::function...

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

    结合lambda表达式、std::function和std::bind,C++11提供了一套强大的工具,使得编写简洁、灵活且高度封装的代码成为可能。这些特性简化了回调函数的处理,提高了代码的可读性和维护性,是现代C++编程不可或缺的部分...

    C++11-14教程.pdf

    C++11和C++14标准引入了一系列重要的新特性和改进,这些新特性旨在提高C++语言的现代化程度,增加编程的便捷性、效率与安全性。本篇教程将详细介绍C++11和C++14中新增的语法规则和特性,以及一些旧特性的弃用情况,...

    C++中使用function和bind绑定类成员函数的方法详解

    &lt;hello&gt; pf = std::bind(&Test1::fun,t,2); pf(4); // return 0; } 输出的值是2,说明pf传进去的4并没有什么用,在bind的时候值已经绑定死了,但是pf()这样不给参数会报错。 如果我们想自定义参数,使用占位符,...

    c++11FAQ中文版

    - std::function和std::bind:提供了更加灵活的函数调用方式。 - std::array和std::forward_list:引入了固定大小的数组容器和单向链表容器。 - shared_ptr和unique_ptr:提供了更安全的智能指针。 - 正则表达式...

    C++11学习总结.doc

    ### C++11 新特性与代码改进分析 #### 一、C++11 特性概览 ...通过利用 C++11 的新特性,如 `noexcept`、`std::bind` 和 `std::function`,可以更好地控制程序的行为,并使代码更容易扩展和维护。

    c++11/14/17

    通过std::function和std::bind,可以更方便地处理函数对象。完美转发的引入使得函数能够转发其参数的属性,进一步增强了模板编程的灵活性。 在标准库方面,C++11增加了std::array、std::forward_list等容器,并引入...

    c++ boost bind

    其中,`boost::bind`是Boost库中的一个关键组件,用于实现函数对象的绑定,它类似于C++11中的std::bind,但在C++98/03标准下非常有用。 `boost::bind`的主要功能是将函数或成员函数与部分参数预先绑定在一起,形成...

    c++11教程最新版

    C++11引入了一系列新的关键字,这些关键字极大地增强了语言的表达能力和代码的可读性。 1. **`auto`**:`auto` 关键字允许编译器根据初始化表达式的类型自动推断变量的类型。这种类型推导不仅使得代码更加简洁,...

    STL (C++11标准)

    此外,STL算法中新增的函数对象如std::function和std::bind等,使得对函数的处理更加灵活。 C++11对STL中的迭代器也有所增强,提出了移动语义的概念,这有助于减少不必要的复制操作,提高了算法执行的效率。特别是...

    基于boost的bind与function的消息处理框架

    在IT领域,Boost库是一个非常重要的C++工具集,它为C++标准库提供了许多扩展功能,其中`bind`和`function`是两个非常实用的工具。本文将深入探讨这两个概念以及如何在消息处理框架中使用它们。 首先,让我们了解`...

    c++实现委托和事件

    这样,我们就使用C++的`std::function`和`std::bind`实现了类似于C#中的委托和事件机制。这种方法虽然没有C#那样的语法糖,但依然能够提供功能强大的回调管理和事件通知。在实际项目中,这种机制可以用于实现如UI...

    APIHook、InlineHook库,使用C++11编写,可将回调函数绑定到类成员函数

    例如,`std::function`和`std::bind`可以用于创建可调用对象,这些对象可以表示任何函数或成员函数,从而简化了回调函数的管理。另外,C++11的右值引用和移动语义提高了代码的性能,使得函数对象的复制更加高效。在...

    C++ Lambda Story - From C++98 to C++20.pdf

    书中还深入探讨了Lambda表达式与C++标准库中的函数对象的关系,如`std::function`和`std::bind`。作者提醒读者,尽管`std::bind`在某些情况下仍然有用,但C++14和C++17引入的Lambda特性使得Lambda成为更现代、更推荐...

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

    在C++标准库STL中,`std::bind`、`std::tuple`和`std::function`是三个非常重要的工具,它们各自有着独特的功能,同时也常常协同工作以完成复杂的功能。 1. `std::function`: 这是一个可以存储任何类型的可调用对象...

    Master-Class-C++11.pdf

    - function和bind:提供函数包装和参数绑定的功能。 - 智能指针(Smart pointers):包括unique_ptr、shared_ptr和weak_ptr,自动管理内存。 - 原子操作(Atomics):为并发编程提供原子操作。 - 强枚举(Strong...

Global site tag (gtag.js) - Google Analytics