如何将内联匿名函数分配给C++函数指针
How do I assign an inline anonymous function to a C++ function pointer
我在一台使用C++的Arduino机器上运行了一些代码。 设置(非常粗略(在主函数中如下所示。 这个例子相当做作,代码设计并没有真正通过气味检查,但这是我能做的最好的事情。
有一个第三方WiFi库,我正在尝试添加一个"onDisconnect"钩子。 当我的 TaskRunner 类执行时,我会将一个函数附加到这个挂钩上,以便在 WiFi 断开连接时,我的任务运行程序会收到通知。
挑战是我对语言的了解不够,无法分配一个匿名函数,该函数也使"isWifiConnected"保持在范围内。 我正在即时学习C++,所以请随时更改问题的标题,因为我甚至可能没有问正确的问题。
请注意,我可能不是在寻找匿名函数。 我正在尝试在调用onDisconnect((时更新isWifiConnected属性。
#include <iostream>
using namespace std;
// A 3rd Party class
// https://github.com/Hieromon/AutoConnect/blob/master/src/AutoConnect.h
// https://github.com/Hieromon/AutoConnect/blob/master/src/AutoConnect.cpp
class AutoConnect {
public:
AutoConnect(){};
// I add this to the class as a hook to be called at about
// line 549 code block where AutoConnect calls disconnect code
void (*onDisconnect)();
};
void onDisconnect(){
cout << "Disconnecting!" << endl;
cout << "But how to make isWifiConnected false? I don't have access :/";
};
// My task runner
class TaskRunner {
public:
bool isWifiConnected;
AutoConnect *connector;
TaskRunner(AutoConnect & connector){
this->connector = & connector;
}
void execute(){
isWifiConnected = true;
// run some WiFi connection code ...
// assign the onDisconnect hook to be run when it disconnects
connector -> onDisconnect = onDisconnect;
// but how can I update "isWifiConnected" = false when the onDisconnect runs
// In JavaScript, I could do
/*
connector -> onDisconnect = function(){
// variable stays in scope due to closure.
isWifiConnected = false;
}
*/
}
};
int main() {
cout<<"Running ..." << endl;
// Instantiate my classes and inject WifiConnector into my task runner
AutoConnect connector;
TaskRunner runner = TaskRunner(connector);
// Simulate an event loop for effect
for(int i = 0; i < 10; i++){
if(i == 0) runner.execute();
// on some other condition, Wifi is disconnected
if(i == 9) connector.onDisconnect();
}
return 0;
}
关于如何更新TaskRunner的isWifiConnected变量的任何想法? 我已经尝试了各种指针组合,但不能完全正确。
除了代码的其他问题(请参阅问题注释(:
您可以将 lambda 存储在std::function
中:
而不是void (*onDisconnect)();
std::function<void()> onDisconnect;
宣布它.(需要#include<functional>
(
然后,您可以在其中存储捕获的 lambda:
connector->onDisconnect = [this](){
isWifiConnected = false;
};
由于这存储了一个指向*this
的指针,因此必须确保TaskRunner
对象比对此钩子/lambda的任何潜在调用都长寿。否则,程序将具有未定义的行为。
特别是目前TaskRunner
是在main
中AutoConnect
对象之后声明的,这意味着后者将在AutoConnect
之前被销毁,因此当TaskRunner
已经被销毁时,可能会调用lambda。如果AutoConnect
的析构函数可以调用 lambda,则尤其如此。有没有我不知道。
- 当我尝试通过构造函数分配 char 数组时出现错误
- c++如何为类成员函数分配内存
- 如何将析构函数分配给指针
- 当我们在C++中创建类的对象时,为成员函数分配的内存在哪里?
- 将来自类的特定实例的函数分配给变量以保持状态
- 为什么我不能使用已删除或私有析构函数分配类的数组?
- 如何将 gmock 函数分配给特定的函数指针
- 将成员函数分配给实例成员的属性
- 当设置对象等于另一个函数的返回值时,为什么要调用移动构造函数/分配
- 尝试将返回无符号值的函数分配给指向无符号的指针时,继续获取 SIGSEGV
- 当 lambda 函数必须访问其他成员时,如何将该函数分配给结构成员
- 将 lambda 函数分配给静态成员变量 (c++)
- 如何安全地释放构造函数分配的资源
- 如何将函数分配给函数指针?
- 是否可以在基类中删除复制和移动构造函数/分配运算符
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- 为什么从工厂函数分配向量并在循环中迭代它会导致段错误
- 如何在隐式复制构造函数/分配运算符中压制成员
- 在将函数分配给函数指针时,为什么可以多次使用取消任务运算符
- C 将成员对象函数分配给类成员功能