【发布时间】:2018-11-17 16:08:35
【问题描述】:
您好,我想将成员函数作为参数传递给其他类的构造函数。我尝试了很多解决方案,但都失败了。 所以.. 头等舱..
class WebSocketsServerRunner : public WebSocketsServer {
private:
ThreadController<uint8_t> threads = ThreadController<uint8_t>();
SensorsState sensorsState;
void notifyClient(uint8_t clientNumber) { // this is the callback
String message = sensorsState.readAsJSON();
WebSocketsServer::sendTXT(clientNumber, message);
}
void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
// solution bellow doesn't work!
Thread<uint8_t>* thread = new Thread<uint8_t>(static_cast<int>(num), &WebSocketsServerRunner::notifyClient, num, 5000);
threads.add(thread);
}
};
和线程构造函数声明:
Thread(int _id, void (*callback)(void) = NULL, long _interval = 0);
Thread(int _id, void (*callback)(Arg), Arg arg, long _interval = 0);
Arg 是template <typename Arg>
我什么都试过了..std::bind、&CLASS_NAME::METHOD_NAME、static_cast 但没有任何效果..
编译给了我:
no known conversion for argument 2 from 'void (WebSocketsServerRunner::*)(uint8_t) {aka void (WebSocketsServerRunner::*)(unsigned char)}' to 'void (*)(unsigned char)'
...
no matching function for call to 'Thread<unsigned char>::Thread(int, void (WebSocketsServerRunner::*)(uint8_t), uint8_t&, int)'
【问题讨论】:
-
最大的问题在
Thread类中,因为指向非静态成员函数的指针不等于非成员函数指针.我建议你看看std::function开始帮助你解决这个问题。继续使用std::bind或lambdas 可能是明智的。 -
auto const bind = std::bind(&WebSocketsServerRunner::notifyClient, this, std::placeholders::_1); Thread<uint8_t>* thread = new Thread<uint8_t>(static_cast<int>(num), bind, num, 5000);给我no known conversion for argument 2 from 'const std::_Bind<std::_Mem_fn<void (WebSocketsServerRunner::*)(unsigned char)>(WebSocketsServerRunner*, std::_Placeholder<1>)>' to 'void (*)(unsigned char)':( -
可以修改
Thread吗?否则,您可能无法做到这一点。如果Thread需要一个函数指针,我不知道将您的对象绑定到此方法。 -
我可以修改 ;) 但如何修改? std::function 而不是函数指针?
-
经典方法是将指向您的类的指针传递到回调的参数中,并从静态回调中调用您的成员函数。问题是当你的线程需要一个没有你的 this 指针的静态签名时,编译器正在为你做这件事。但实际上你为什么不使用允许你使用函数对象的 std::thread ,这意味着你可以根据需要使用 std::function 和 std::bind ?
标签: c++ compiler-errors callback std functor