(Auteur)
Tout d'abord, les Prétoriens réponse est correcte, mais j'aimerais développer un peu.
Notez que cette bibliothèque est encore très expérimental et je travaille encore sur la documentation.
L'état actuel de la dite documentation peut être trouvé dans le wiki, en particulier https://github.com/schlangster/cpp.react/wiki/User-Guide-%7C-Signals est liée à la question.
Voici un autre exemple détaillé:
int calcVolume(int w, int h, int d) { return w*h*d; }
D::VarSignalT<int> width = D::MakeVar(1);
D::VarSignalT<int> height = D::MakeVar(2);
D::VarSignalT<int> depth = D::MakeVar(3);
D::SignalT<int> volume = MakeSignal(&calcVolume, width, height, depth);
Observe(volume, [] (int v) {
printf("volume changed to %d\n", v);
});
width.Set(10); // => volume changed to 60.
printf("volume: %d\n", volume.Value()); // short: volume()
C'est une sorte de bind (bind signaux d'entrée de la fonction), mais ce n'est PAS la même que d'une inversion de std::bind. le volume n'est pas un objet de fonction.
En particulier, le volume n'est pas recalculée lorsque vous appelez la Valeur(), il est recalculé lorsque l'un de ses signaux dépendants de change, le résultat est enregistré, et la Valeur() renvoie.
C'est donc essentiellement pousser le changement de propagation avec quelques fonctionnalités supplémentaires (non redondant mises à jour, pas de problèmes, en option implicite parallélisation).
Le problème est que MakeSignal devient source de confusion lorsqu'il est mélangé avec temporaire des signaux et des lambdas:
// First create a temporary area signal, then use it as an argument for the volume signal
D::SignalT<int> volume = MakeSignal(
[] (int a, int d) { return a * d; },
MakeSignal(
[] (int w, int h) { return w * h; },
width, height),
depth);
Personne ne veut lire des trucs comme ça, non? Au moins, je ne le veux pas.
Donc, il y a une syntaxe alternative qui déplace les dépendances vers la gauche, enveloppé par SignalList.
// Note: Not sure if I have already pushed this variant yet
D::SignalT<int> volume =
MakeSignalList(
MakeSignalList(width, height).Bind([] (int w, int h) { return w * h; }),
depth
).Bind([] (int a, int d) { return a * d; });
Et, enfin, avec le mal virgule et ->* surcharges:
D::SignalT<int> volume =
(
(width, height) ->* [] (int w, int h) { return w * h; },
depth
)
->* [] (int area, int d) { return a * d; };
Le problème avec cela, comme d'autres l'ont noté, c'est que quiconque voit pour la première fois il ne sait pas ce que le diable est en cours.
D'autre part, la connexion de signaux à des fonctions devrait être une tâche très courante lors de l'utilisation de cette bibliothèque.
Une fois que vous savez ce qu'il fait, l' ->* la version la plus concise et il permet de visualiser le graphe de flux de données (sur les bords de la largeur et de la hauteur de la zone temporaire, les bords de la zone et la profondeur du volume).