为create_pthread()调用强制转换成员函数
Cast member function for create_pthread() call
我想停止警告
server.cpp: 823:警告:从"void * (ClientHandler:: )()"到"空白 ()(空白)
:
pthread_create(th, NULL,
(void* (*)(void*)) &ClientHandler::handle,
(void *) clientHandler);
其中handle()
是ClientHandler
的成员函数:
void* ClientHandler::handle();
我很难从编译器中破译函数类型消息。
问题是:
- 我应该改变
handle()
接口吗?我可以摆脱铸造整体吗? - 我应该改变演员吗?到底是什么?
- 完全不同的东西?
你不能直接这样做,成员函数的指针不是普通的函数指针,不能直接交给C
回调。
你需要一个间接层次:
void callHandle(void *data) {
ClientHandle *h = static_cast<ClientHandle*>(data);
h->handle();
}
pthread_create(th, 0, &callHandle, static_cast<void*>(handle));
参见c++常见问题解答的成员指针一节了解更多信息。
关于callHandle
中强制转换的有效性,请参见这个问题。当然,当callHandle
被调用时,您唯一负责确保handle
仍然存活并且运行良好(并且它实际上指向ClientHandle
)。
您需要将静态cdecl函数传递给pthread_create
,如下签名所示:
void* handler(void* data);
可选参数可用于将ClientHandler
对象传递给线程。
class ClientHandler()
{
public:
static void* handle(void* data);
}
extern "C" {
void* ClientHandler::handle(void* data)
{
ClientHandler* handler = reinterpret_cast<ClientHandler*>(data)
// fancy stuff with handler object here
}
} /* extern "C" */
如果您希望从ClientHandler
类的特定实例调用ClientHandler::handle
方法,不幸的是,它比您的示例要复杂一点,因为指向成员函数的指针与指向一般函数的指针不同。关于以这种方式创建pthread需要做什么的完整描述,请参阅此处。
相关文章:
- 从成员指针到整个结构/类的强制转换
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 从类成员函数到类 C 函数指针的转换
- 静态成员变量不会由 gettext 转换
- 指针类型类成员的动态强制转换的恒定性是什么?
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 转换模板中的成员函数指针
- 传递可变参数时在成员初始值设定项列表中强制转换
- 将函数强制转换为成员函数
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 指向类成员函数的指针中存在类型转换错误
- 在不复制数据的情况下,将double数组转换为只有double成员的structs数组
- 为什么不能指向指针,在没有强制转换的情况下访问结构成员?
- 将结构C++成员从非常量转换为常量
- C++:易失性实例中的易失性成员函数 - 将数组分配给指针是无效的转换?
- 返回带有另一个类的数据成员的构造函数?遇到转换错误?
- 如何将任何值转换为对象并使用 boost::p roperty_tree json 添加成员
- 虚拟地将结构向量转换为结构成员的向量
- 为create_pthread()调用强制转换成员函数
- 转换成员函数指针