У меня возникла проблема с этим типом реализации обратного вызова в C++. В приведенном ниже коде я хотел бы сохранить обратный вызов в «OnRenderingComplete». Однако у меня возникли проблемы с запоминанием параметров «ad» и «callback» для «adOnRenderingComplete». Как это реализовано на C++?Подражание специальному обратному вызову JavaScript в C++
var adOnRenderingComplete = function(ad, callback) {
};
var setAdPlaybackCallbacks = function(ad, callback) {
OnRenderingComplete = function() { adOnRenderingComplete.call(this, ad, callback); };
};
В JavaScript, кажется, что это возможно, так как там может быть встроена функция хранения параметров «объявления» и «обратного вызова» ... но я не знаю, как это будет сделано в C++. В конечном итоге мне бы хотелось вызвать OnRenderingComplete(), при этом он «запоминал» параметры «объявление» и «обратный вызов».
Мне тяжело. Я не могу понять этого. Единственное, что я могу придумать, это определить класс внутри функции и передать функцию этого класса в OnRenderingComplete. Но даже в этом случае нижеследующее неверно и не компилируется.
void testCall(void (*callback)())
{
callback();
}
void test1()
{
class blah
{
public:
int a;
int b;
void c()
{
cout << "a * b = " << a*b << endl;
};
};
blah ex;
ex.a = 5;
ex.b = 3;
void(*OnRenderingComplete)() = ex.c;
testCall(OnRenderingComplete); // I would like to have this print the value of a*b
}
По существу, я пытаюсь захватить "ex.c" в переменной обратного вызова "OnRenderingComplete". Но в то же время я хотел бы получить значение ex.a и ex.b, так что ex.c можно вызвать, «запоминая» данные для «a» и «b». После выполнения вызова «testCall (OnRenderingComplete)» я хотел бы, чтобы функция наверху для testCall() могла печатать значение a * b.
Вы можете использовать lambdas, если вы компилируете на C++ 11. – Synxis
Спасибо за ваш комментарий Synxis. Можно ли обойтись без C++ 11? – codeshark
Да, но это будет сложнее, в зависимости от того, можете ли вы использовать boost или нет. – Synxis