[C++11] C++11 中的回调
2018年5月2日
之前写 Java 和 OC 非常羡慕其中的回调机制,之前的博客也介绍了一个使用 fast delegate 回调的 C++ 机制(参见:[C++] 简单高效的 delegate 方法)。现在 C++11 已经普及了,也同样支持了回调,虽然比高阶的语言 Java 和 OC 之类还稍显繁琐,但是基本功能已经都有了,这里简单说明如下。
1、回调基本函数
在 C++11 中使用 std::function 定义回调函数和参数类型,使用 std::bind 绑定回调函数。示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> #include <functional> void f(int i) { std::cout << "f is called, i = "<<i<<".\n"; } int main() { // 回调基本函数 std::function<void(int)> callback = std::bind(f, std::placeholders::_1); callback(1); return 0; } |
如果你的程序运行没有问题则会显示如下输出:
1 | f is called, i = 1. |
这就是回调函数定义和使用的基本方式。其中使用回调函数特性需要引入头文件:
1 | #include <functional> |
定义带参数的回调需要使用 std::placeholders 来作为占位符,你可以根据参数多少任意增加 std::placeholders::_1、std::placeholders::_2 等等。
2、回调对象中的函数
示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <iostream> #include <functional> class A { private: int j; public: A() { j = 1; } void f(int i) { std::cout << "A::f is called, i = "<<i<<", j = "<<j<<".\n"; } }; int main() { // 回调对象中的函数 A a; std::function<void(int)> callback1 = std::bind(&A::f, &a, std::placeholders::_1); callback1(2); return 0; } |
如果你的程序运行没有问题则会显示如下输出:
1 | A::f is called, i = 2, j = 1. |
3、回调中的多个参数和返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <iostream> #include <functional> class A { private: int j; public: A() { j = 1; } int f2(int i, int k) { std::cout << "A::f is called, i = "<<i<<", j = "<<j<<", k = "<<k<<".\n"; return 0; } }; int main() { // 多个参数和返回值 std::function<int(int, int)> callback2 = std::bind(&A::f2, &a, std::placeholders::_1, std::placeholders::_2); int r = callback2(2,3); std::cout << "r = " << r << std::endl; return 0; } |
如果你的程序运行没有问题则会显示如下输出:
1 2 | A::f is called, i = 2, j = 1, k = 3. r = 0 |