gpt4 book ai didi

javascript - 在 C++ 中模仿特殊的 JavaScript 回调

转载 作者:行者123 更新时间:2023-11-28 02:59:11 25 4
gpt4 key购买 nike

我在使用 C++ 中实现这种类型的回调时遇到了一些问题。在下面的代码中,我想将回调存储到“OnRenderingComplete”中。但是,我很难记住“adOnRenderingComplete”的“广告”变量和“回调”参数。这是如何在 C++ 中实现的?

var adOnRenderingComplete = function(ad, callback) {

};

var setAdPlaybackCallbacks = function(ad, callback) {

OnRenderingComplete = function() { adOnRenderingComplete.call(this, ad, callback); };
};

在 JavaScript 中,这似乎是可能的,因为可以有一个嵌入式函数存储“ad”和“callback”的参数……但我不确定这在 C++ 中是如何完成的。我最终想调用 OnRenderingComplete(),用它“记住”参数“ad”和“callback”。

我很难过。我似乎无法弄清楚这一点。我能想到的唯一接近的是在函数内定义一个类并将该类的函数传递给 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
}

本质上,我试图在回调变量“OnRenderingComplete”中捕获“ex.c”。但是,与此同时,我想捕获 ex.a 和 ex.b 的值,以便在“记住”“a”和“b”的数据时调用 ex.c。调用“testCall(OnRenderingComplete)”后,我希望 testCall() 顶部的函数能够打印 a*b 的值。

最佳答案

几种解决方案(点击标题查看实例):

C++11 :

#include <functional>

struct MyClass
{
typedef std::function<void (int, bool)> CallbackType;
typedef std::function<void (int, float, bool)> AnotherCallbackType;
CallbackType callback;

void setCallback(AnotherCallbackType c, float param)
{
callback = [&](int a, bool b) { c(a, param, b); };
// Calling the callback:
callback(42, false);
// With lambdas, it is almost like in Javascript,
// you can embed all parameters you want. ex:
std::function<void()> func = [&](){ c(2, param, true); };
func(); // will call c(2, param, true);
}
};

C++03, with Boost :

#include <boost/function.hpp>
#include <boost/bind.hpp>

struct MyClass
{
typedef boost::function<void (int, bool)> CallbackType;
typedef boost::function<void (int, float, bool)> AnotherCallbackType;
CallbackType callback;

void setCallback(AnotherCallbackType c, float param)
{
callback = boost::bind(c, _1, param, _2);
// Calling the callback:
callback(42, false);
// This will call: c(42, param, false)
// The 'param' float parameter has been retained.
// It is possible to retain all parameters when binding, ex:
boost::function<void()> func = boost::bind(c, 2, param, true);
func(); // will call c(2, param, true);
}
};

C++03, without Boost :

struct MyClass
{
typedef void (MyClass::* CallbackType)(int, float);
CallbackType callback;

void onRenderCallback(int param1, float param2) {}
void setCallback(CallbackType c)
{
callback = c;
// Calling the callback:
(this->*callback)(42, 3.14f);
// Note that it is possible to embed the parameters
// but that will need to create a class, basically it means you will reimplement Boost.Bind...
}
};

现在,回到您的代码:

void(*OnRenderingComplete)() = ex.c;

对于指向函数的指针,我强烈建议您使用 typedef:

typedef void (*OnRenderingCompleteType)();
OnRenderingCompleteType callback = ...;

然后,ex.c 具有以下类型:void (blah::*)()。注意 blah::*,这是因为这是一个指向成员函数的指针,不是一个指向函数的指针(成员函数是特殊函数)。这就是作业无法编译的原因。

关于javascript - 在 C++ 中模仿特殊的 JavaScript 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21278944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com