c ++: Можно ли использовать boost :: bind для преобразования функции-члена в ожидаемую сигнатуру указателя функции? - PullRequest
1 голос
/ 15 июля 2011

Я использую стороннюю библиотеку, которая передает указатели функций на вызов метода.

class RTSPClient{
public:
...
  typedef void (responseHandler)(RTSPClient* rtspClient,
             int resultCode, char* resultString);
...
  unsigned sendOptionsCommand(responseHandler* responseHandler, 
             Authenticator* authenticator = NULL);
};

Нормальное использование выглядит следующим образом:

void continueAfterOPTIONS(RTSPClient* client, 
             int resultCode, char* resultString);
....
RTSPClient* pClient;
....
pClient->sendOptionsCommand(continueAfterOPTIONS, NULL);

Теперь я хотел бы сделатьМетод continueAfterOPTIONS - функция-член класса.Обычно я использую boost :: bind для этого:

pRtspClient>sendOptionsCommand(boost::bind(&RtspClientSessionManager::continueAfterOPTIONS, this), NULL);

, что приводит к

error C2664: 'RTSPClient::sendOptionsCommand' : cannot convert parameter 1 from 'boost::_bi::bind_t<R,F,L>' to 'RTSPClient::responseHandler (__cdecl *)'

Я пытался добавить заполнители для аргументов функции, и это не имело значения.Возможно ли то, что я пытаюсь сделать?Возможно, есть способ разыграть результат связывания?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 15 июля 2011

Не из коробки. Тем не менее, позвольте мне набросать, как вы могли бы сделать это.

struct Foo : RTSPClient {
  boost::function<void(int resultCode, char* resultString)> bound;
  Foo(boost::function<void(int resultCode, char* resultString)> bound) : bound(bound) {}

  // Need a static method to get a regaulr function pointer
  static void CallBack(RTSPClient* _this, int resultCode, char* resultString) {
     _this->CallBack(int resultCode, char* resultString
  void CallBack(int resultCode, char* resultString) {
    bound();
  }
};

Конечно, проще, если вы можете получить RtspClientSessionManager из RtspClient

2 голосов
/ 15 июля 2011

boost::bind создает функциональный объект, который совершенно отличается от указателя на функцию. Это объект с перегруженным operator().

Я бы сказал, что это не может быть использовано здесь.

1 голос
/ 15 июля 2011

Вы не можете сделать это таким образом. Библиотека bind создает функциональные объекты, а не реальные функции, и тип сгенерированных указателей будет отличаться.

...