Используя boost :: bind () в коде C, это будет работать? - PullRequest
5 голосов
/ 27 ноября 2011

Могу ли я использовать boost::bind(mycallback, this, _1, _2) в коде C?

Обновление

Краткий ответ: нет , boost bind не возвращает указатель функции, который может быть вызван в коде C, но функтор (объект C ++ с перегруженным оператором () ) см. ответ ниже.

Ответы [ 3 ]

4 голосов
/ 27 ноября 2011

Нет.boost::bind возвращает Функтор , а не указатель функции.Возвращенный объект - это объект C ++ с перегруженным operator(), который позволяет ему вести себя как указатель на функцию в коде C ++.Но это не указатель на функцию, который может быть передан в код C.

4 голосов
/ 27 ноября 2011

Лучший способ сделать то, что вы хотите сделать, это создать обратный вызов C, который затем вызывает функцию boost ::, которая сохраняется в какой-то пользовательской памяти с новым.

Пример:

void callFunction(void* data)
{

   boost::function<void(void)> *func = (boost::function<void(void)>* ) (data);
   (*func)();
   delete(func);
}

Затем вы просто передаете этот обратный вызов и задаете пользовательские данные (однако они указаны в libev) как копию вашей функции, выделенной с новым.

Так вы указываете пользовательские данные.с libev: http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#ASSOCIATING_CUSTOM_DATA_WITH_A_WATCH

2 голосов
/ 27 ноября 2011

Я предполагаю, что вы хотите использовать все, что boost::bind возвращает в качестве функции обратного вызова для библиотеки C?

Если это так, то нет, это не сработает. Он даже не будет построен, так как boost::bind не возвращает указатель на функцию.

...