2017-02-26 2 views
2

Je programme avec RX en C#, et maintenant je souhaite programmer avec rxcpp en C++. J'essaie de faire la chose la plus simple, définir une variable de membre de classe de observable<int>.
Le problème est que observable est défini comme:rxcpp simple observable <int>

template<class T, class SourceOperator> 
class observable 

Qu'est-ce que SourceOperator?
Comment définir un observable<int> simple?

Lorsque l'on regarde dans le code, à rx-observable.hpp (ligne 101):

template<class T, class Source> 
observable<T> make_observable_dynamic(Source&& s) { 
    return observable<T>(dynamic_observable<T>(std::forward<Source>(s))); 
} 

Je trouve observale<T> comme type de retour, mais n'a pas pu trouver sa définition.
C'est tellement bizarre. Honnêtement, je si je suis tout à fait compétent dans C++ 11 \ 14 & Métaprogrammation ... apparemment le trou de lapin peut obtenir beaucoup plus profond :-(

Mise à jour 1:
observale<T> a été trouvé :-) son dans rx-predef.hpp:

template<class T = void, 
     class SourceObservable = typename std::conditional<std::is_same<T,void>::value, 
      void, 
      dynamic_observable<T>>::type> 
class observable; 

ok ma supposition actuelle est que dynamic_observable signifie qu'un observable<T> 'régulier' est un flot dynamique de T. Il est logique, comme vous pouvez seulement effacer le type-effacé comme une variable avec un type explicite.
Ce qui m'amène à ma prochaine conjecture, que la syntaxe de template<class T, class SourceOperator> class observable permet la création de type observable combiné d'autres observables dans le 'decorator' pattern (décoration de la compilation). quelque chose comme illustré here

+0

C'est bizarre. L'exemple sur la page [github] (https://github.com/Reactive-Extensions/RxCpp) définit plusieurs variables sans spécifier 'SourceOperator':' observable 'et' observable '. – Rakete1111

+0

La documentation de cette chose vraiment nul. http://reactive-extensions.github.io/RxCpp/classrxcpp_1_1observable.html#details utilise 'SourceOperator' partout sans expliquer ce que cela signifie. Certainement pas quelque chose que j'utiliserais en dehors des projets de jouets privés. –

+1

Oui, la mise à jour 1 est correcte! En C++, la valeur par défaut est de laisser le compilateur voir le type statique complet et de réduire tous les opérateurs ensemble pour les performances. SourceOperator est le type complet de l'observable détenu par le type observable générique. La méthode as_dynamic() sur un observable retournera le observable effacé par type, ce qui impose une surcharge d'appel de fonction virtuelle et un surcoût d'allocation de tas évités par défaut. –

Répondre

0

observale<T> a été trouvé :-) son dans rx-predef.hpp:

template<class T = void, 
     class SourceObservable = typename std::conditional<std::is_same<T,void>::value, 
      void, 
      dynamic_observable<T>>::type> 
class observable; 

dynamic_observable signifie un observable<T> qui est une dynamique, flux de type ereased de T. Il est logique , comme vous ne pouvez que sotre type effacé flux en tant que variable avec un type explicite.
La syntaxe de template<class T, class SourceOperator> class observable permet la création de type observable combiné d'autres observables dans le 'decorator' pattern (décoration de la compilation). quelque chose comme illustré here