C 中的回调
回调是函数或类接受的可调用对象,用于根据回调自定义当前逻辑。
何时使用回调:
- 编写独立于被调用函数逻辑的通用代码。
- 启用动态运行时行为(例如,更改游戏中的按钮功能)。
- 通知来电者具体情况
C 11 中的可调用:
回调可以采取各种形式,所有形式都被视为“可调用”:
- 函数指针
- std::function对象
- Lambda 表达式
- 绑定表达式
- 函数对象(具有重载函数调用运算符的类)
回调表示法:
1。函数指针
- typedef return_type (*f_int_t) (int);
- int (* foo_p)(int) = &foo;
- int foobar(int x,int (*moo)(int));
- int foobar (int x, f_int_t moo);
2.指向成员函数的指针
- typedef int (C::* f_C_int_t) (int x);
- int (C::* C_foo_p)(int) = & C::foo;
- int C_foobar (int x, C const &c, int (C::*moo)(int));
- int C_foobar (int x, C const &c, f_C_int_t moo);
3. std::function 对象
- std::function stdf_foo = &foo;
- int stdf_foobar (int x, std::function moo);
4.模板化回调
这允许更通用的代码。
- 模板 void stdf_transform_every_int_templ(int * v, unsigned const n, std::function fp);
- 模板; void transform_every_int_templ(int * v, unsigned const n, F f);
兼容的回调类型:
-
函数指针: 功能指针
-
std::function 对象: 函数指针、lambda 表达式、绑定表达式、函数对象
-
模板化回调: 任何可调用类型(例如、lambda 表达式、绑定表达式、函数对象)
示例:
-
函数指针示例:
void tranform_every_int(int * v, unsigned n, int (*fp)(int));
int double_int(int x) { return 2*x; }
int square_int(int x) { return x*x; }
登录后复制
-
std::function 对象示例:
void stdf_tranform_every_int(int * v, unsigned n, std::function<int(int)> fp);
int a[5] = {1, 2, 3, 4, 5};
stdf_tranform_every_int(&a[0], 5, Meow{8});
登录后复制
-
模板化回调示例:
int nine_x_and_y (int x, int y) { return 9*x + y; }
using std::placeholders::_1;
stdf_transform_every_int_templ(&a[0], 5, std::bind(nine_x_and_y, _1, 4));
登录后复制
以上是回调如何增强 C 代码功能?的详细内容。更多信息请关注PHP中文网其他相关文章!