Bonjour,
je n'arrive pas à trouver le bon pattern pour régler un problème de pipeline qu'on pourrait résumer par un petit schéma :
1 | input ---[stage 1]---> output1 = input2 ---[stage 2]---> output2 = input3 ---[stage 3]---> output3 ---> ... |
Donc à partir d'un input, réussir à trouver l'output qui est le résultat du processing de $N$ stages tel que:
$output = stage_{N}(stage_{N-1}(...stage_{2}(stage_{1}(input))...))$
La difficulté étant que chaque input ou output peut être d'un type différent (un entier, un nombre décimal, une matrice, un vecteur, …). Bien sûr, pour que la chaîne fonctionne l'input du stage $M$ est du même type que l'output du stage $M-1$.
Voilà une solution (à base de class templates) qui ne marche pas. J'aimerais avoir un comportement final qui imite ce qui est contenu dans le main():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | #include <iostream> template <typename T, typename P> class Stage { protected: Stage* next; T* input; P* output; public: Stage(): next(nullptr), input(nullptr), output(nullptr) {} void add(Stage* n) { if (next) { next->add(n); } else { next = n; next->set_output(); next->set_input(output); } } void set_input(T* in) { input = in; } void set_output() { output = new P; } void compute() { process(); if (next) return next->compute(); else std::cout << output << endl;; } virtual void process() = 0; virtual ~Stage() {}; }; class Add: public Stage<int,int> { private: int c; public: Add(int m = 1): c{m} {} void process() { *output = *input + c; } }; class Threshold: public Stage<int,bool> { private: int t; public: Threshold(int m = 1): t{m} {} void process() { *output = (bool) *input < t; } }; int main(int argc, char* argv[]) { Stage* stage1 = new Add(5); Stage* stage2 = new Add(2); Stage* stage3 = new Threshold(100); stage1->add(stage2); stage1->add(stage3); int* in = new int(42); stage1->set_input(in); stage1->compute(); // should cout 1 (because 42+5+2=49 < 100) } |
Quel serait une bonne solution pour arriver au comportement voulu ? En prenant en compte qu'il est important de garder l'héritage de classes (une classe abstraite Stage dont hérite toutes les implémentations) et que les variables input et output doivent rester des pointeurs vers des variables externes.
Merci d'avance.