21xrx.com
2024-11-05 14:44:27 Tuesday
登录
文章检索 我的文章 写文章
C++11 回调函数
2023-07-04 01:48:02 深夜i     --     --
C++11 回调函数 Lambda表达式 std::function 异步编程

C++11是C++标准的最新版本,其中增加了一些新的语言特性和标准库。其中一个新特性是回调函数。

回调函数是一种在调用函数时传递函数指针或函数对象的方式。被调用的函数在一定条件下会调用传入的函数指针或对象。这种方式可以让应用程序在调用函数时不必考虑后续的处理逻辑,而是让另一个函数来处理后续的逻辑,从而解耦代码。

在C++11之前,回调函数通常使用函数指针实现。但是函数指针需要用户自己维护,很容易出现错误。C++11引入了std::function模板来替代函数指针。std::function是一个通用的函数对象封装器,可以存储任何可调用对象,包括函数指针、成员函数指针和函数对象。

下面是使用std::function的一个简单例子:


#include <iostream>

#include <functional>

void foo(std::function<void()> cb)

{

  std::cout << "foo called" << std::endl;

  cb();

}

int main()

{

  foo([] std::cout << "callback called" << std::endl; );

  return 0;

}

在上面的示例中,函数foo接受一个std::function类型的参数cb,cb可以是任何可以被调用的对象。在main函数中调用foo,并传入一个lambda表达式作为回调函数。

使用std::function还可以实现一些高级功能,比如将一个成员函数作为回调函数。下面是一个使用std::bind和std::function的例子:


#include <iostream>

#include <functional>

class A

{

public:

  void callback(int n) std::cout << "A::callback called with " << n << std::endl;

};

void foo(std::function<void(int)> cb)

{

  std::cout << "foo called" << std::endl;

  cb(42);

}

int main()

{

  A a;

  auto f = std::bind(&A::callback, &a, std::placeholders::_1);

  foo(f);

  return 0;

}

在上面的示例中,我们定义了一个类A和一个成员函数callback。我们使用std::bind将callback函数和类A的对象绑定在一起,得到一个std::function对象f。我们将f作为回调函数传递给foo函数,并在foo函数中调用回调函数,传递了一个整数参数。

C++11的std::function模板使得回调函数实现更加简单和安全。使用std::function,我们可以将函数指针、成员函数指针和函数对象封装在同一个模板中,避免了指针类型不匹配的问题,提高了代码的可读性和可维护性。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复