2017-06-12 8 views
1

Rx-cppobserver/observableパターンを実装しようとしています。これらは、誰かがこれにどのように対処できるかについて、非常に興味深いtutorialであるRx.Netです。このC#例でRxCppを使用してObserver/Observableパターンを構築する

、我々はオーバーライドする必要があり、そのinterfaces特定があります。

public interface IObserver<in T> 
{ 
    void OnCompleted(); 
    void OnError(Exception error); 
    void OnNext(T value); 
} 


public interface IObservable<out T> 
{ 
    IDisposable Subscribe(IObserver<T> observer); 
} 

を私が理解する限りでは、Rx-cppに、このような利便性はありませんが。ですから、上記のinterfacesと同様のヘッダーの例(myObservable.h/myObserver.h)を私に提供することが可能ですか?同じ通信パターンを定義するためのガイダンスとして使用できますか?

ご協力いただきありがとうございます。 ありがとうございました!

EDIT 1:@zentrunixから おかげで、私はクラス指向の通信をしようとしています。これまでは、観測可能なパターンのコードがあります。私が望むのは、私が観察可能なものに添付される観察者のリストを定義することです。OnNextと呼ばれる人にこれらの観察者に通知する必要があります。しかし、欠けている部分があります。

  1. どのようにすることができます私はそれらのオブザーバーmyObservable::Subscribe()関数が呼び出される(Rx::subscribers<int>)にsubscribe()
  2. どうすればいいですかunsubscribe()
  3. 最後に、複数のonNextオブザーバーの対応するo.subscribe(onNext, onEnd);はどのようになりますか?対応するmyObserverクラスを構築することは可能でしょうか?尋ねるため
  4. 申し訳ありませんが(再びhereに触発さ)が、それは意味のある、そのような組織ですか?これまで私はこのtutorialで提供されているアーキテクチャを使用していました。これが私がこの作業に夢中になっている理由です。私はそれをRxCppに関与する方法として見つけました。すべてのコメントは高く評価されています。 (自分の無知のために再び申し訳ありません。)

    class myObservable { 
    
    private: 
    
    std::shared_ptr<std::list<rxcpp::subscriber<int>>> observers; 
    
    public: 
    
    myObservable() { observers = std::make_shared<std::list<Rx::subscriber<int>>>(); }; 
    
    Rx::observable<int> Attach(std::shared_ptr<rxcpp::subscriber<int>> out) { 
    
        return Rx::observable<>::create<int>([&, out]() { 
         auto it = observers->insert(observers->end(), *out); 
         it->add([=]() { 
          observers->erase(it); 
         }); 
        }); 
    
    }; 
    
    void OnNext(int sendItem) { 
    
        for (Rx::subscriber<int> observer : *observers) { 
         (observer).on_next(sendItem); 
        } 
    } 
    
    void Disposer(Rx::subscriber<int> out) { 
    
        observers->erase(std::remove(observers->begin(), observers->end(), &out), observers->end()); 
    }; 
    }; 
    
+0

私がしようとしているのは、 'RxCpp''オブザーバー'と 'observable'関数を継承する2つのクラスを構築することです。 'Rx.Net'の例では、これは' class myIObserver:IObserver 'によって行われます。これは、 'virtual'にクラスを変換する方法ではなく、むしろSubjectObserver'と同じ機能を実行し、 'myObserver.h'と' myObservable.h'を構築する方法:IObserver 'と' SubjectObservable:IObservable '相応。彼に感謝します。 – Thoth

+0

私は 'c#' 'interfaces'をつ​​ける理由は' 'OnComplete()' 'OnNext(T value)'など)を実装しなければならないためです。 – Thoth

+0

あなたの質問は言い換える必要があると思います。また、私はちょうどいくつかのRxCppソース(例えば、https://github.com/Reactive-Extensions/RxCpp/blob/master/Rx/v2/src/rxcpp/rx-observer.hpp)を見てきました。インタフェースのように見えるものはすべて見てください。私はあなたが完全に間違った方法でこれに近づいているかもしれないと思います。 – Rook

答えて

2

以下RxCppで非常に簡単な例。 あります(少なくとも)1つの警告は、しかし:典型的なRxCppコードは、私は非常に嫌いラムダ、を多用して。

また、インターネット上のドキュメントやチュートリアルを検索しようとしましたが、見つかりませんでした。私は特にスレッドモデルについての説明に興味があります。

あなたは、コードとDoxygenのドキュメントを通じて苦労して喜んでいる場合は、RxCpp GitHubのサイトの例がたくさんあります。

#include <iostream> 
#include <exception> 

#include "rxcpp/rx.hpp" 
namespace rx = rxcpp; 

static void onNext(int n) { std::cout << "* " << n << "\n"; } 
static void onEnd() { std::cout << "* end\n"; } 

static void onError(std::exception_ptr ep) 
{ 
    try { std::rethrow_exception(ep); } 
    catch (std::exception& e) { std::cout << "* exception " << e.what() << '\n'; } 
} 

static void observableImpl(rx::subscriber<int> s) 
{ 
    s.on_next(1); 
    s.on_next(2); 
    s.on_completed(); 
} 

int main() 
{ 
    auto o = rxcpp::observable<>::create<int>(observableImpl); 
    std::cout << "*\n"; 
    o.subscribe(onNext, onEnd); 
} 
関連する問題