【发布时间】:2020-12-26 16:50:56
【问题描述】:
我想将 c++ objcet 成员回调函数 传递给一个 "c" lib,它只有 void*。然后我使用 std::function 注册回调处理程序。但是当我将 std::function* 转换为 void* 时出现问题,似乎 std::function* 在转换为 void* 时被破坏。
下面是测试代码。
#include <iostream>
#include <functional>
class TfLight {
public:
void print(int a) {
std::cout << "TfLight::print " << a << std::endl;
}
};
class Server {
public:
void run(int a) {
std::function<void(int)>* func = reinterpret_cast<std::function<void(int)>*>(ptr);
std::cout << func << std::endl;
(*func)(a);
}
void register(std::function<void(int)> tf) {
std::cout << (&tf) << std::endl;
// f = tf;
setPtr(&tf);
}
void setPtr(void* p) {
ptr = p;
}
std::function<void(int)> f;
void* ptr;
};
int main()
{
TfLight* tf = new TfLight();
Server* server = new Server();
server->register(std::bind(&TfLight::print, tf, std::placeholders::_1));
server->run(3333);
delete server;
delete tf;
}
当我使用全局变量持有“std::function
但是当我将 std::function* 转换为 void* 时出现问题,似乎 std::function* 在转换为 void* 时被破坏了
【问题讨论】:
-
旁白:您不需要
new来创建TfLight或Server