Что я получил до сих пор: < /p>
Код: Выделить всё
void MyCallback(double a, unsigned char b, unsigned char* c)
{
// do something
}
Код: Выделить всё
extern "C" BOOL CALLBACK ExternalDLL_SetCallback(void(*pCallbackFunc)(double a, unsigned char b, unsigned char* c));
Код: Выделить всё
ExternalDLL_SetCallback(&MyCallback); // this works
Я попытался использовать std :: bind () , чтобы захватить это и передать его обратным вызовом:
Код: Выделить всё
using namespace std::placeholders;
typedef void (*cbf_t)(double, unsigned char, unsigned char*);
class MyClass {
public:
void MyCallback(double a, unsigned char b, unsigned char* c) { this->doClassStuff(a); }; // callback function as a class member
void doClassStuff(double a); // example function
void setCallback() {
m_cbfunc = std::bind(&MyClass::MyCallback, this, _1, _2, _3);
ExternalDLL_SetCallback((cbf_t)&m_cbfunc);
};
std::function m_cbfunc;
}
Я также пытался использовать лямбда-функцию для магического захвата:
Код: Выделить всё
m_cbfunc = [this](double a, unsigned char b, unsigned char* c) { this->doClassStuff(a); }; // Lambda callback function
Есть ли простой способ обойти эту ловушку, не углубляясь слишком далеко в реализацию в стиле ассемблера?
На практике У меня будет несколько объектов MyClass, устанавливающих свои обратные вызовы и время от времени вызываемых из внешней DLL. Если обратный вызов является функцией-членом, каждый вызов автоматически назначается правильному объекту MyClass.
Но, поскольку пока я могу получить только статическую функцию обратного вызова, я не не вижу хорошего способа отслеживать, какой объект зарегистрировал обратный вызов при его поступлении.
Можете ли вы дать мне совет, как это можно легко реализовать?
Можете ли вы дать мне совет, как это можно легко реализовать?
Можете ли вы дать мне совет, как это можно легко реализовать?
p>
Обновление:
Я понял, что лямбды с захватом нельзя привести к указателю на функцию. Это работает только для простых лямбд. В моем случае: cbf_t func = +[](double a, unsigned char b, unsigned char* c) { std::cout
Подробнее здесь: https://stackoverflow.com/questions/793 ... unction-in