用于create_pthread()调用的cast成员函数

tow*_*owi 3 c c++ member-function-pointers function-pointers pthreads

我想停止警告

server.cpp:823:警告:从'void*(ClientHandler :: )()'转换为'void()(void)'

在通话中:

pthread_create(th, NULL,
    (void* (*)(void*)) &ClientHandler::handle,
    (void *) clientHandler);
Run Code Online (Sandbox Code Playgroud)

其中handle()是成员函数ClientHandler:

void* ClientHandler::handle();
Run Code Online (Sandbox Code Playgroud)

我很难从编译器中解密函数类型的消息.

问题是:

  • 我应该更改handle()界面吗?我可以摆脱整体铸造吗?
  • 我应该改变演员吗?到底是什么?
  • 完全不同的东西?

Mat*_*Mat 7

你不能直接这样做,指向成员函数的指针不是函数的简单指针,不能直接交给C回调函数.

您需要一个级别的间接:

void callHandle(void *data) {
  ClientHandle *h = static_cast<ClientHandle*>(data);
  h->handle();
}

pthread_create(th, 0, &callHandle, static_cast<void*>(handle));
Run Code Online (Sandbox Code Playgroud)

有关更多信息/替代方案,请参阅C++ FAQ 的" 指向成员指针"部分.

有关演员的有效性callHandle,请参阅此问题.你自己负责确保它handle仍然存在并且当callHandle被调用时(以及它实际上指向a的事实ClientHandle).