函子是否总能替换回调 在C++中,函子总是可以替换回调吗?或者有需要“定期”回调的情况? 也就是说,每个函数都有一个函数指针,取而代之的是一个函子,具有与函数指针相同的参数和返回值?

函子是否总能替换回调 在C++中,函子总是可以替换回调吗?或者有需要“定期”回调的情况? 也就是说,每个函数都有一个函数指针,取而代之的是一个函子,具有与函数指针相同的参数和返回值?,c++,callback,functor,C++,Callback,Functor,传统的C函数指针不能只用任何函子来替代。 因此,带有operator()重载的结构或带有捕获变量的lambda将不起作用。请参阅以下代码: #包括 //此函数采用void()函数指针 void run_回调(void(*callback)(){ 回调(); } //此函数接受std::函数 void run_函数(std::function fun){ 乐趣(); } 结构可调用{ void运算符(); }; int main(){ int x; 运行_回调([](){});//确定 运行_回调

传统的C函数指针不能只用任何函子来替代。 因此,带有
operator()
重载的结构或带有捕获变量的lambda将不起作用。请参阅以下代码:

#包括
//此函数采用void()函数指针
void run_回调(void(*callback)(){
回调();
}
//此函数接受std::函数
void run_函数(std::function fun){
乐趣();
}
结构可调用{
void运算符();
};
int main(){
int x;
运行_回调([](){});//确定
运行_回调([x](){});//错误,不允许捕获x
运行_callback(Callable{});//错误,无法将Callable转换为函数指针
运行函数([](){});//确定
运行函数([x](){});//也可以
运行_函数(可调用{});//也可以
}
如果您想要一个只适用于从函数指针到lambda/functor的任何东西的解决方案,那么请使用
std::function

在调用C++ API时,

C函数指针是必需的。 C函数指针在性能关键型应用程序中也更好。


std::function
可以接受任何内容,因为在内部,它将函数指针和函子包装在多态包装器类中。这需要一个虚拟函数调用,这意味着
std::function
需要在指针知道调用什么之前取消对它的引用。而且
std::function
可以为空。因此,它需要测试每个调用是否为空,并抛出
std::bad_function_call
,如果是空的话。

取决于回调的定义。如果您需要使用C API回调(也就是函数指针),那么答案是否定的。函子与C样式的函数指针不兼容。但非捕获lambda是兼容的。