漏斗函数能否总是取代回调

问题描述 投票:0回答:1

在C++中,是否可以用漏斗函数代替回调函数?或者在某些情况下,需要 "常规 "的回调,例如,每个接受函数指针的函数,都要接受一个与函数指针具有相同参数和返回值的functor?

c++ callback functor
1个回答
1
投票

传统的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 如果是的话

© www.soinside.com 2019 - 2024. All rights reserved.