在C++中,是否可以用漏斗函数代替回调函数?或者在某些情况下,需要 "常规 "的回调,例如,每个接受函数指针的函数,都要接受一个与函数指针具有相同参数和返回值的functor?
传统的C语言函数指针不能用任何一个漏斗来代替,所以结构中的函数指针与C++中的函数指针是一样的。operator()
重载或带有捕获变量的lambdas将无法使用。请看下面的代码。
#include <functional>
// this function takes a void() function pointer
void run_callback(void(*callback)()) {
callback();
}
// this function takes a std::function
void run_function(std::function<void()> fun) {
fun();
}
struct Callable {
void operator()();
};
int main() {
int x;
run_callback([](){}); // OK
run_callback([x](){}); // ERROR, we are not allowed to capture x
run_callback(Callable{}); // ERROR, can't convert Callable to function pointer
run_function([](){}); // OK
run_function([x](){}); // ALSO OK
run_function(Callable{}); // ALSO OK
}
如果你想要一个对函数指针和lambdasfunctors都适用的解决方案,那么使用 std::function
.
当从C++调用C API时,C函数指针是必要的。
在对性能要求较高的应用中,C函数指针也是比较好的。std::function
可以接受任何东西,因为在内部,它把函数指针和漏斗函数包装在一个多态包装类中。这需要一个虚拟函数调用,也就是说 std::function
在知道要调用什么之前,需要对一个指针进行反引用。另外 std::function
可以是空的。因此,它需要测试每次调用是否为空,并抛出 std::bad_function_call
如果是的话