Обычно C-подобные обратные вызовы принимают параметр void* user_data
, который позволяет передавать все, что вы хотите:
void c_func(void (*fptr)(void*), void* user_data){
// do some stuff
fptr(user_data);
}
Теперь просто сделайте следующую статическую функцию-член:
class A{
public:
static void c_callback(void* my_data){
A* my_this = static_cast<A*>(my_data);
// do stuff with my_this
}
};
Редактировать: Согласно комментарию @ Martin, вам может не повезти со статической функцией-членом.Лучше использовать функцию extern "C"
: extern "C" void c_callback (void * my_data) {// то же, что и статический метод} И передать этот + ваш A
экземпляр этому c_func
:
int main(){
A a;
c_func(&A::c_callback,&a);
}
Или, если этот экземпляр A
должен пережить текущую область действия, вам нужно каким-то образом сохранить указатель, выделенный в куче, где-нибудь и впоследствии удалить его вручную.A shared_ptr
или лайки здесь не сработают, к сожалению.: (
Что касается вашей проблемы с сохранением указателя на карте, это не проблема, посмотрите этот небольшой пример на Ideone .