Я работаю посредством установки функции членства как обратный вызов для C-библиотеки, которую я использую. C-библиотека настраивает обратные вызовы как это:
typedef int (*functionPointer_t)(myType1_t*, myType2_t*, myType3_t*);
setCallback(param1, param2, functionPointer, param4)
Я хотел бы использовать повышение:: свяжите (если возможный) для передачи в указателе функции. Я предпочел бы, чтобы указываемая функция была членом инстанцированного класса, не статическим участником. Например.
Class A {
public:
A();
protected:
int myCallback(myType1_t*, myType2_t*, myType3_t*); //aka functionPointer_t
}
Может это быть сделанным с помощью повышения:: свяжите и повысьте:: функция? На то, Как я могу передать функцию членства класса как обратный вызов? (3-й ответ) кажется, что я мог объявить следующее (где-нибудь, или как определение типа):
boost::function myCallbackFunction
И затем где-нибудь в (ctor) называют повышение:: привяжите тот тип и передайте его в вызов C-библиотеки.
Действительно ли это возможно, или является мной от основы? Большое спасибо.
Нет. Типы фанкторов типа boost::function
не преобразуются в указатели функций для использования с механизмами обратного вызова C.
Однако, большинство механизмов обратного вызова C имеют какой-то токеновый механизм, так что ваша функция обратного вызова (которая является статической) имеет некоторую контекстную информацию. Вы можете использовать это для написания оберточного класса, который сопоставляет эти маркеры с объектами functor, и передает выполнение в правильном направлении:
class CallbackManager {
public:
typedef boost::function<int (type1*, type2*, type3*)> callback;
static void setCallback(CallbackManager::callback cb)
{
void *token = ::setCallback(staticCallback);
callbacks[token] = callback_I;
}
static void staticCallback(void* token, type1* a, type2* b, type3* c)
{ return mcallbacks[token](a, b, c); }
private:
static std::map<void*, callback > callbacks;
};
Проблема с функций-членов заключается в том, что они автоматически получают указатель на экземпляр объекта в качестве первого параметра - указатель "this". Поэтому нельзя использовать функции-члены обратного вызова C. Чтобы использовать функцию-член, необходимо иметь вместе объект и указатель на функцию.
.