我有這種情況,我想不通。
我想在從一個物件到他的孩子的函式向量中添加一個函式,如下所示:
孩子:
std::vector<void (*)(STATE oldState, STATE newState)> stateChangeHandlers;
void Digital_Output::addOnStateChangeHandler(void (*function)(STATE oldState, STATE newState)) {
this->stateChangeHandlers.push_back(function);
}
家長/所有者
Digital_Outputs::Digital_Outputs(json outputsConf) { //nlohmann::json
int idx = 0;
for (auto output: outputsConf) {
Digital_Output *DO = new Digital_Output(output["pin"].get<int>(), idx);
//from here
DO->addOnStateChangeHandler([DO](STATE oldState, STATE newState) -> void*{ //note the capture
json j;
j["state"] = newState;
std::string jsonStr = j.dump();
mqtt::message_ptr pubmsg = mqtt::make_message(std::string(this->getTopicBase() "/" DO->getName()), &jsonStr); //note the this
});
//to here
this->addOutput(DO);
std::cout << "Added Output name: " << DO->getName() << " forced: " << BoolToString(DO->isForced()) << ":" << DO->getForcedValue() << " retain: " << BoolToString(DO->isRetain()) << ": " << DO->getRetainValue() << " comment: " << DO->getComment() << std::endl;
idx ;
}
}
VSCode 告訴我:
沒有從 "lambda []void *(STATE oldState, STATE newState)->void *" 到 "void (*)(STATE oldState, STATE newState)" 的正確轉換函式
接下來,存盤的函式通過以下方式執行:
void Digital_Output::_onStateChange(STATE oldState, STATE newState) {
for(std::vector<void (*)(STATE oldState, STATE newState)>::iterator it = std::begin(this->stateChangeHandlers); it != std::end(this->stateChangeHandlers); it) {
(*it)(oldState, newState);
}
}
uj5u.com熱心網友回復:
您的向量包含 C 樣式的函式指標。但是,捕獲lambda 不能轉換為函式指標(這是錯誤訊息試圖告訴您的),只有非捕獲lambda 可以。要存盤捕獲的 lambda,您將不得不使用它std::function。
此外,您的 lambda 回傳 a void*,但您的向量需要回傳的函式void。
此外,您的 lambda 正在嘗試使用this而不捕獲它。
試試這個:
孩子
using stateHandlerFunc = std::function<void(STATE, STATE)>;
std::vector<stateHandlerFunc> stateChangeHandlers;
void Digital_Output::addOnStateChangeHandler(stateHandlerFunc function) {
stateChangeHandlers.push_back(function);
}
家長/所有者
Digital_Outputs::Digital_Outputs(json outputsConf) { //nlohmann::json
int idx = 0;
for (auto output: outputsConf) {
Digital_Output *DO = new Digital_Output(output["pin"].get<int>(), idx);
DO->addOnStateChangeHandler(
[this, DO](STATE oldState, STATE newState) {
json j;
j["state"] = newState;
std::string jsonStr = j.dump();
mqtt::message_ptr pubmsg = mqtt::make_message(std::string(this->getTopicBase() "/" DO->getName()), &jsonStr);
}
);
addOutput(DO);
std::cout << "Added Output name: " << DO->getName() << " forced: " << BoolToString(DO->isForced()) << ":" << DO->getForcedValue() << " retain: " << BoolToString(DO->isRetain()) << ": " << DO->getRetainValue() << " comment: " << DO->getComment() << std::endl;
idx ;
}
}
void Digital_Output::_onStateChange(STATE oldState, STATE newState) {
for(auto&& handler : stateChangeHandlers) {
handler(oldState, newState);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/441478.html
標籤:C
