我想知道实际使用回调函数的位置?
两个最常见的用途是允许用户实现算法的一部分(例如,传递给C qsort和C++ 的比较器std::sort允许对任意类型进行排序),并接收外部事件的通知(例如,在许多异步用户中)接口和通信库,例如Boost.Asio).
有没有办法在C/C++中实现回调函数(除了使用函数指针)?
没有C/C++这样的语言.
在C中,唯一合理的机制是函数指针.
在C++中有很多种方法.对于那些喜欢OOP的人来说,一种常见的方法是定义一个抽象接口类.在那里声明的虚函数充当回调,并且可以调用派生实现类中定义的任意代码.
那些喜欢泛型和函数式编程的人会改为定义一个重载的类operator()- 通常称为"functor"或"function object".这样的东西可以像函数一样调用,但也可以随身携带状态.此模式在整个标准库中广泛使用,例如为容器和自定义比较器提供自定义分配器以进行排序算法.
这两种方法都可以更方便地为回调提供额外的信息 - 可能是一个调用成员函数的对象,或一个用于比较函数参数的值.在C中,任何这样的"用户"状态都必须通过回调中的额外参数传递 - 如果回调机制的设计者忽略了包含它,那么使用它可能非常棘手.
C++ 11提供了一些处理仿函数的方便的新方法.std::function是一种多态类型,可以表示任何类似函数的东西,如果你不想模板化函数类型,它是一个很好的类型用于回调.std::bind和lambda表达式是从一些任意代码片段定义仿函数的简单方法.
回调可以用作多态和泛型编程的简单替代
脱离背景,这没有多大意义.我想这意味着,如果你使用函数指针进行回调,则不需要定义任何抽象接口或仿函数.如果他们认为多态性和通用性很复杂,有些人可能会认为这更简单; 但它也带来了它自己的复杂性,因为没有类型安全的方法将任意用户数据传递给回调,就像使用C++方法一样.
| 归档时间: |
|
| 查看次数: |
812 次 |
| 最近记录: |