2013-03-27 6 views
0

Я очень новичок в библиотеках boost.повышающие функции функции указатели

Я пытался что-то сделать для графической программы, привязывая обратные вызовы, прошедшие , к glutDisplayFunc() и т. Д. Для одного класса.

Я хотел выполнить это, не имея постоянного объекта глобального класса.

Для объяснения в коде:

class CallbackHolder { 
public: 
    void dostuff(void) { 
     // etc. 
    } 
}; 
void bind() { 
    glutIdleFunc((new CallbackHolder())->dostuff); 
} 

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

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

Как бы вы это сделали?

+0

Вы не можете преобразовать 'boost :: function' в обычный указатель функции. Вы должны использовать регулярную обычную функцию в качестве обратного вызова, нет никакого способа обойти это. –

ответ

0

Вы не можете конвертировать из boost::function в обычный указатель на функцию, и вы не можете преобразовать из указателя функции-члена в обычный указатель на функцию. Возможны обходные пути для функций, принимающих обратный вызов, где вы можете предоставить данные пользователя.

К сожалению, интерфейс перенасыщения не позволяет предоставлять данные пользователя. Это означает, что вы застряли с самым уродливым решением, используя глобальную переменную и нормальную функцию.

class CallbackHolder { 
    public: 
    void dostuff(void) { 
     // etc. 
    } 
}; 

CallbackHolder * g_callbackHolder = NULL; 

void call_callback_holder(void) { 
    if(g_callbackHolder) g_callbackHolder->dostuff(); 
} 

void bind() { 
    g_callbackHolder = new CallbackHolder(); 
    glutIdleFunc(&call_callback_holder); 
} 
+0

Darn. Я действительно надеялся, что мне не придется это делать, поскольку исходный код может стать действительно уродливым. Спасибо, в любом случае. – object