Как уже указывалось в комментариях - аргумент, который ожидает конструктор UdpTask(String (*handleGson)(String));
, не является указателем на функцию-член. Скорее это указатель на функцию free . Указатель на функцию-член будет иметь вид:
String (GsonHandler::*)(String)
Обратите внимание, что указатель на член должен знать член его типа.
Что касается вашей первоначальной проблемы - существует несколько способов ее решения (как всегда в случае с C ++).
Наиболее простым является использование std::function<String(String)>
для хранения functor
. Это любой объект, который можно назвать. Так что-то вроде:
class UdpTask : public Task {
public:
UdpTask(std::function<String(String)> f);
private:
...
std::function<String(String)> handler;
};
В реализации вы просто называете это как: handler(args);
В случае, если вы не можете использовать функцию std
- другое решения могут быть изучены.
Простейшим будет сохранить указатель на обработчик в вас UdpTask
и вызвать его метод напрямую:
class UdpTask : public Task {
public:
UdpTask(GsonHandler* handler);
private:
...
GsonHandler* handler;
};
В реализации вы просто вызываете его как : handler->handleGson(args);
Теперь я признаю, что могут существовать некоторые опасения насчет жесткой связи между UdpTask
и тем, что является экстенционально UDP data handler
. Поэтому вы можете подумать о создании универсального c интерфейса для DataHandler, сохранении указателя на него и создании GsonHandler
реализации DataHandler
:
struct DataHandler {
virtual ~DataHandler() = default;
virtual String handleData(String data) = 0;
};
struct GsonHandler: public DataHandler {
String handleData(String data) override;
...
};
...
class UdpTask : public Task {
public:
UdpTask(DataHandler* handler);
private:
...
DataHandler* handler;
};