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

 更新时间:2021年07月30日 10:00:55   作者:tycoon3  
这篇文章主要介绍了C++11 学习笔记之std::function和bind绑定器,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

std::function

      C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法五花八门。为了统一泛化函数对象,函数指针,引用函数,成员函数的指针的各种操作,让我们可以按更统一的方式写出更加泛化的代码,C++11推出了std::function。

  std::function是可调用对象的包装器。它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指针,并允许保存和延迟执行它们。

1.1 可调用对象(Callable Objects)

可调用对象有如下几种:

  • 函数指针
  • 具有operator()成员函数的类对象(仿函数)
  • 可被转换为函数指针的类对象
  • 类成员(函数)指针

以上涉及的对象可以像一个函数一样做调用操作,统称为可调用对象。现在,C++11通过提供std::function和std::bind统一了可调用对象的各种操作。

1.2 可调用对象包装器——std::function

C++中的可调用对象虽然具有比较统一操作形式(除了类成员指针之外,都是后面加括号进行调用),但定义方法五花八门。为了统一泛化函数对象,函数指针,引用函数,成员函数的指针的各种操作,让我们可以按更统一的方式写出更加泛化的代码,C++11推出了std::function。

  std::function是可调用对象的包装器。它是一个类模板,可以容纳除了类成员(函数)指针之外的所有可调用对象。通过指定它的模板参数,它可以用统一的方式处理函数,函数对象,函数指针,并允许保存和延迟执行它们。

#include <iostream>
#include <functional>
 
using namespace std;
 
 void func(void){
     cout << __FUNCTION__ <<endl;
 }
 
 class Foo
 {
 public:
     static int foo_func(int a){
         cout << __FUNCTION__ << "(" << a << ") ->: ";
         return a;
     }
 };
 
 class Bar
 {
 public:
     int operator()(int a){
         cout << __FUNCTION__ << "(" << a << ") ->: ";
         return a;
     }
 };
 
 int main(){
     //綁定一個普通函數
     std::function<void(void)> fry = func;
     fry();
 
     
     //綁定一個類的靜態成員函數
     std::function<int(int)> fr2 = Foo::foo_func;
     cout << fr2(123) << endl;
     
     //綁定一個仿函數
     Bar bar;
     fr2 = bar;
     cout << fr2(123) <<endl;
 
     return 0;
 }
root@ubuntu:~/c++# g++ -std=c++11 func1.cpp -o func
root@ubuntu:~/c++# ./func 
func
foo_func(123) ->: 123
operator()(123) ->: 123
root@ubuntu:~/c++#

std::function的使用方法:我们给std::function填入合适的函数签名(即一个函数类型,只需要包括返回值和参数表)之后,它就变成了一个可以容纳所有这一类调用方式的“函数包装器”。

#include <iostream>
#include <functional>
 
using namespace std;
 
 class A
 {
 public:
     A(const std::function<void()>& f) :callback_(f){}
     
     void notify(void){
         callback_();
     }
 private:
     std::function<void()> callback_;
 };
 
 class Foo
 {
 public:
     void operator()(void){
         cout <<"in " <<  __FUNCTION__<< endl;
     }
 };
 
 int main(){
     Foo foo;
     A aa(foo);
     aa.notify();
     
     return 0;
 }
"func2.cpp" 32L, 452C written                                              
root@ubuntu:~/c++# g++ -std=c++11 func2.cpp -o func
root@ubuntu:~/c++# ./func
in operator()

C++11 std::function 是一种通用、多态的函数封装,它的实例可以对任何可以调用的目标实体进行存储、复制和调用操作,它也是对 C++中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的),换句话说,就是函数的容器。当我们有了函数的容器之后便能够更加方便的将函数、函数指针作为对象进行处理。例如:lambda函数

到此这篇关于C++11 学习笔记之std::function和bind绑定器的文章就介绍到这了,更多相关C++11 std::function和bind绑定器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenCV基于稠密光流实现视频跟踪详解

    OpenCV基于稠密光流实现视频跟踪详解

    这篇文章主要为大家详细介绍了OpenCV如何基于稠密光流实现视频跟踪功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-02-02
  • Qt界面中滑动条的实现方式

    Qt界面中滑动条的实现方式

    这篇文章主要介绍了Qt界面中滑动条的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++类实现通讯录功能

    C++类实现通讯录功能

    这篇文章主要为大家详细介绍了C++类实现通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 详解C++ Qt中堆叠窗体的使用案例

    详解C++ Qt中堆叠窗体的使用案例

    这篇文章主要为大家详细介绍了C++ Qt中堆叠窗体的使用案例,文中的示例代码讲解详细,对我们学习QT有一定的帮助,感兴趣的小伙伴可以了解一下
    2023-08-08
  • C语言实现斐波那契数列(非递归)的实例讲解

    C语言实现斐波那契数列(非递归)的实例讲解

    下面小编就为大家带来一篇C语言实现斐波那契数列(非递归)的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Qt实现简易秒表设计

    Qt实现简易秒表设计

    这篇文章主要为大家详细介绍了Qt实现简易秒表设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++中使用哈希表(unordered_map)的一些常用操作方法

    C++中使用哈希表(unordered_map)的一些常用操作方法

    C++标准库中使用的unordered_map底层实现是哈希表,下面这篇文章主要给大家介绍了关于C++中使用哈希表(unordered_map)的一些常用操作方法,需要的朋友可以参考下
    2022-03-03
  • Linux线程同步之信号C语言实例

    Linux线程同步之信号C语言实例

    这篇文章主要介绍了Linux线程同步之信号C语言实例,本文直接给出代码实例,需要的朋友可以参考下
    2015-04-04
  • c语言重要的字符串与内存函数

    c语言重要的字符串与内存函数

    这篇文章主要介绍一些c语言中常用字符串函数和内存函数的使用和注意事项,并且为了帮助读者理解和使用,也都模拟实现了他们的代码,需要的朋友可以参考一下
    2021-09-09
  • 基于C++ list中erase与remove函数的使用详解

    基于C++ list中erase与remove函数的使用详解

    本篇文章是对C++ list中erase与remove函数的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论