14

I've recently discovered, and fallen in love with, the Deferred/Promise pattern used in jQuery. It just encapsulates so many async use cases, including the wonderful chaining, filtering ability, that I can't believe I missed it for so long.

I've just finished refactoring my AS3 code to use the excellent CodeCatalyst/promise-as3 library (https://github.com/CodeCatalyst/promise-as3), and so started thinking about going back to my C++ code and seeing how I could implement the pattern there.

Before I started coding this myself, I checked to see if it had been done before, and discovered the std::future/std::promise (and boost equivalents), but they are very heavy (they seem use real threads etc, and have a heavy template syntax).

So, my question is: Is there are lightweight, pure C++ implementation of the Deferred/Promise pattern, jQuery-style?

refs:

4

7 に答える 7

14

ネクロマンサーを演じて申し訳ありませんが、私もC++ でA+スタイルの promise を使用することに非常に興味があり、それを実装するための最良の方法を何年もかけて考えました。私は最終的に成功しました。ここで私の実装を見ることができます。

使用法は非常に簡単ですが、テンプレート化とテンプレート メタプログラミングを多用します。次に例を示します。

Promise<int> promise;

promise.future().then([](int i){
    std::cout << "i = " << i << std::endl;
    return "foobar";
}).then([](const std::string& str){
    std::cout << "str = " << str << std::endl;
});

promise.resolve(10);

これは次のように出力されます。

i = 10
str = foobar
于 2015-08-15T21:05:33.080 に答える
8

あなたが求めているソリューションがどれほど軽量かはわかりませんが、std::asyncは future/promise ペアの設定を大幅に簡素化し、呼び出し元が作業を別のスレッドによって非同期的に実行するか、遅延させて実行するかを決定できるようにします同じスレッドで実行。いずれにせよ、呼び出し元は明示的なスレッド管理を行う必要はありません。

于 2012-07-09T05:21:52.237 に答える
6

あなたが求めていることが C++ ではほとんど不可能だと思う理由がいくつかあります。

まず第一に、C++11 の新しいラムダ構文をインライン関数宣言 (JavaScript では簡単で非常に軽量) に利用するには、テンプレートを使用してそれらを使用する必要があります。

次に、JavaScript とは異なり、タイマー/完了キューを保留するための自動 UI スレッドがないため、実行の準備ができているタスクを監視するスレッドのプールを作成する必要があります。次のステップ。

「純粋な C++」および「軽量」(および暗黙のスレッドレス) と言うとき、他に何を思い浮かべますか?

于 2012-07-09T05:25:31.440 に答える
1

協力的なマルチタスカーを使用できます。アプリケーションで使用しています。私が抱えている唯一の問題は、ラムダを list<> 内に格納して後で呼び出すと、キャプチャされた変数が核になることです。私はまだ解決策を見つけていませんが、これを行うことができるはずだと確信しています。

于 2014-03-23T04:27:16.907 に答える