2016-05-15 5 views
0

私はC++を初めて使っています。新しい言語を学びながらいくつかのjavasciptスクリプトを移植しようとしています。C++シグナルコールバック(javascriptのような)

私は特に以下

はjavasciptでスクリプトですjs-signalsライブラリと同じように、JavaScriptなどのコールバックを使用するための解決策を見つけようとしています。 C++に変換できますか?どうやって?いいえ、最良の解決策は何ですか?

Javascriptを

var ns = { 
    _callback: null, 
    setUpdate: function(callback) { 
     ns._callback = callback; 
    }, 
    update: function() { 
     // do some default things 
     ns._callback(); 
    } 
}; 
ns.setUpdate(function() { 
    console.log("I'm Changed"); // will be: std::cout << "I'm Changed\n"; 
}); 

C++

namespace ns { 
    // ?? 
}; 
// ns::setUpdate(??); 
+0

はい、C++でコールバックを行うことができます。私はあなたのJSコードに最も近いC++(私はJSについて何も知らないので、私は推測しているにすぎません)は 'std :: function'メンバ変数にラムダを格納することだと思います。 – MikeMB

+1

"関数ポインタC++"と "ラムダ式C++"を検索します。これで処理が始まります.....処理する方法はたくさんありますが – DarthRubik

答えて

2

機能poi NTER、そのような:

#include <cstdio> 
namespace ns { 
    // defines a type named Callback that is a pointer 
    // to a function that takes void and returns void 
    typedef void (*Callback)(); 
    Callback _callback; 

    void setUpdate(Callback cb) { 
    _callback = cb; 
    } 
    void update() { 
    _callback(); 
    } 
} 

void MyUpdate() { 
    printf("hello from callback\n"); 
} 

int main(int argc, char* argv[]) { 

    ns::setUpdate(MyUpdate); 
    ns::update(); 
} 

出力:

も参照のコールバックから

こんにちは:Typedef function pointer?

+0

ありがとうございます。これが何をしているのか説明できますか? "typedef void(*コールバック)();" – Liakos

+0

は説明するコードにコメントを追加しました。 –

1

私はそのようなnamespaceを使用することはありません。 classは、おそらくより良いフィット感、何かのために、このようなものです:私は1
アップデートを変更してい

更新と呼ばれる出力が

Updateが呼ばれるこの意志は
私はと呼ばれる

#include <iostream> 
#include <functional> 

class MyThing 
{ 
public: 
    MyThing() {} 
    MyThing(const std::function<void()>& callback) : callback_(callback) {} 
    void setUpdate(const std::function<void()>& callback) 
    { 
     callback_ = callback; 
    } 

    void update() 
    { 
     std::cout << "Update called\n"; 
     if (callback_) { 
      callback_(); 
     } 
    } 
private: 
    std::function<void()> callback_; 
}; 

int main() 
{ 
    MyThing my_thing1; // callback_ is initially unset in this object 
    my_thing1.update(); // no callback is called 
    my_thing1.setUpdate([](){ std::cout << "I'm Changed 1\n"; }); 
    my_thing1.update(); // calls the lambda set in the previous line 
    MyThing my_thing2([](){ std::cout << "I'm Changed 2\n"; }); 
    my_thing2.update(); // calls the lambda in the prevous line 
} 

変更されました2

0

これは、ポートへの良い方法であるJavaScriptのJS-信号ライブラリへC++:

#include <string> 
#include <map> 
#include <functional> 

// You only need this Signal class 
class Signal { 

    // store all callbacks to a string map 
    std::map<std::string, std::function<void()>> callbacks; 

    // check if callback already exists. optional 
    bool exists(std::string key) { 
     if (callbacks.find(key) == callbacks.end()) {return false;} 
     else {return true;} 
    } 

    public: 
    void add(std::string key, std::function<void()> cb) { 
     if (!exists(key)) {remove(key);} 
     callbacks.insert(std::pair<std::string, std::function<void()>>(key, cb)); 
    } 
    void remove(std::string key) { 
     callbacks.erase(key); 
    } 
    void dispatch() { 
     for (std::map<std::string, std::function<void()>>::iterator it = callbacks.begin(); it != callbacks.end(); it++) { 
      callbacks[it->first](); 
     } 
    } 

    // this destroys the signal 
    void dispose() { 
     callbacks.clear(); 
    } 
}; 

int main() { 
    // create a signal 
    Signal* onFire = new Signal(); 

    // add some callbacks 
    int a_variable = 10; 
    onFire->add("a_sound_is_heard", [&]() { 
     // some code when onFire.dispatch() happens 
     std::cout << "i can use this variable too :) " << a_variable << std::endl; 
     // you can also use the onFire variable 
    }); 
    onFire->add("a_bullet_appears", [&]() { 
     // some code again 
    }); 

    // remove some callbacks (add a silencer for your gun) 
    onFire->remove("a_sound_is_heard"); 

    // whenever you want, execute the event 
    onFire->dispatch(); 

    // don't forget to delete the signal from memory 
    onFire->dispose(); 
    delete onFire; 

    return 0; 
} 
関連する問題