Кто-нибудь заметил, что принятый ответ работает только в тривиальных случаях? Единственный способ, которым функция <> :: target () вернет объект, который может быть связан с обратным вызовом C, - это если он был создан с объектом, который может быть связан с обратным вызовом C. Если это так, то вы могли бы связать его напрямую и пропустить всю функцию <> ерунда для начала.
Если подумать, волшебного решения для этого не существует. Обратный вызов в стиле C хранится в виде одного указателя, который указывает на исполняемый код. Любой нетривиальный boost :: function <> будет нуждаться как минимум в двух указателях: один на исполняемый код, другой на данные, необходимые для установки вызова (например, указатель this в случае связанного члена функция).
Правильный способ использования boost :: function и boost :: bind с обратными вызовами C - это создать функцию shim, которая удовлетворяет сигнатуре обратного вызова, определяет, какую функцию <> вызывать, и вызывает ее. Обычно обратные вызовы C будут иметь некоторую пустоту * для «пользовательских данных»; вот где вы прячете свой указатель на функцию:
typedef void (*CallbackType)(int x, void* user_data);
void RegisterCallback(CallbackType cb, void* user_data);
void MyCallback(int x, void* userData) {
boost::function<void(int)> pfn = static_cast<boost::function<void(int)> >(userData);
pfn(x);
}
boost::function<void(int)> fn = boost::bind(myFunction(5));
RegisterCallback(MyCallback, &fn);
Конечно, если ваша подпись обратного вызова не содержит какой-либо указатель пользовательских данных, вам не повезло. Но любой обратный вызов, который не включает указатель пользовательских данных, уже неприменим в большинстве реальных сценариев и должен быть переписан.