Функтор C ++ как указатель на функцию - PullRequest
5 голосов
/ 21 августа 2011

У меня есть Functor, который мне нужно отправить в функцию, которая получает указатель функции в качестве параметра (например, CreateThread).

Могу ли я как-то преобразовать его в статический адрес метода?И если нет, как я могу это сделать?

1 Ответ

8 голосов
/ 21 августа 2011

Нет, вы не можете преобразовать объект типа класса в указатель на функцию.

Однако вы можете написать не обёртную функцию-обертку, которая вызывает функцию-член в нужном экземпляре. Многие API, в том числе CreateThread, позволяют указывать указатель, который он возвращает вам при вызове вашего обратного вызова (для CreateThread это параметр lpParameter). Например:

DWORD WINAPI FunctorWrapper(LPVOID p)
{
    // Call operator() on the functor pointed to by p:
    return (*static_cast<FunctorType*>(p))();
}

// Used as:
FunctorType f;
CreateThread(0, 0, &FunctorWrapper, &f, 0, 0);
...