Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中模拟特殊的JavaScript回调+; 我在C++中遇到了这种类型的回调实现。在下面的代码中,我想将回调存储到“OnRenderingComplete”中。但是,我记不起“adOnRenderingComplete”的“ad”变量和“callback”参数。 如何在C++中实现?< /P> var adOnRenderingComplete = function(ad, callback) { }; var setAdPlaybackCallbacks = function(ad, callback) { OnRenderingComplete = function() { adOnRenderingComplete.call(this, ad, callback); }; };_Javascript_C++_Callback - Fatal编程技术网

在C+中模拟特殊的JavaScript回调+; 我在C++中遇到了这种类型的回调实现。在下面的代码中,我想将回调存储到“OnRenderingComplete”中。但是,我记不起“adOnRenderingComplete”的“ad”变量和“callback”参数。 如何在C++中实现?< /P> var adOnRenderingComplete = function(ad, callback) { }; var setAdPlaybackCallbacks = function(ad, callback) { OnRenderingComplete = function() { adOnRenderingComplete.call(this, ad, callback); }; };

在C+中模拟特殊的JavaScript回调+; 我在C++中遇到了这种类型的回调实现。在下面的代码中,我想将回调存储到“OnRenderingComplete”中。但是,我记不起“adOnRenderingComplete”的“ad”变量和“callback”参数。 如何在C++中实现?< /P> var adOnRenderingComplete = function(ad, callback) { }; var setAdPlaybackCallbacks = function(ad, callback) { OnRenderingComplete = function() { adOnRenderingComplete.call(this, ad, callback); }; };,javascript,c++,callback,Javascript,C++,Callback,在JavaScript中,这似乎是可能的,因为可以有一个嵌入式函数存储“ad”和“callback”的参数。。。但我不确定如何在C++中实现这一点。我最终希望调用OnRenderingComplete(),让它“记住”参数“ad”和“callback” 我的日子不好过。我似乎无法理解这一点。我唯一能想到的是在函数中定义一个类,并将该类的函数传递给OnRenderingComplete。但即便如此,下面的内容是错误的,无法编译 void testCall(void (*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
}
void测试调用(void(*callback)()
{
回调();
}
void test1()
{
课堂废话
{
公众:
INTA;
int b;
void c()
{
cout几种解决方案(点击标题可获得一个实例):

#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);
    }
};
#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);
    }
};
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;
对于函数指针,我郑重建议您使用typedefs:

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

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

如果您使用C++11编译,您可以使用lambdas。谢谢您的评论Synxis。没有C++11可以吗?是的,但这将更复杂,取决于您是否可以使用boost。啊,我明白了……任何帮助都将不胜感激。您知道没有bo的情况下该怎么做吗OST/Boost?你能创建一个最小的工作示例并显示你在C++中尝试过的吗?在某些上下文中,回答你的具体问题将是很容易的。因此,例如,我想要实现的一个例子是:OnReDeReCyTeType回调=(这个-**回调)(42,3.14f);我想能够调用“CalbBeF”()。“并让它记住参数42和3.14f。您有权访问C++11吗?将编译器作为注释(或在问题中)发布。语法
(this->*func)(args)
用于指向成员函数的指针,这是回调的最低级别。为了完整性,我将其放在答案中,但我建议您使用C++11。”(或者至少是Boost)。谢谢!我将使用C++11实现这一点,并使用std::bind方法!这太棒了。谢谢你的帮助。
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
}