На данный момент я установил, что у вас есть API, который принимает функцию и указатель, и вам нужно предоставить его таким.Я предполагаю, что вы всегда должны указывать ему указатель A *
Если это очень общий обратный вызов, но должен быть функцией (не может быть boost :: function) и должен быть указателем (возможно, void*) тогда вам нужна функция, подобная этой:
struct GenericHolder
{
boost::function0<void> func;
};
void GenericCallback( void * p )
{
GenericHolder * holder = static_cast< GenericHolder * >(p);
holder->func();
delete holder;
}
Как и в этом случае, я вызываю delete во время вызова, поэтому я предполагаю, что мы вызываем new во время вызова, т.е.указатель на который сделан ваш звонок.Конечно, это может быть не так, что ваш указатель, который вы передаете, удаляется при первом вызове, поэтому управляйте временем жизни соответствующим образом.
Если вы контролируете «другую сторону», то не делайте этого намеренно, нона этой стороне удерживайте boost :: function и просто вызывайте ее.
Управление памятью все еще может быть проблемой, о которой вам нужно позаботиться.Например, когда вы вызываете boost :: bind, он оборачивает вещи в закулисную структуру.Если это указатели, которые вы наделили новыми, вам нужно как-то удалить их.Если они являются ссылками, они все равно должны быть действительными в точке вызова.указатели на локальные переменные также могут быть проблемой.shared_ptrs идеальны, конечно.И очень сложно найти отслеживание ошибок в ошибке boost :: bind, если вы часто используете эту концепцию.