• # Faire ça au runtime ? je préfère faire ça à la compilation.

    Posté par . En réponse au journal Et Dieu inventa le soutien gorge !. Évalué à 10.

    C'est bête de faire ça au runtime, alors que tu pourrai donner à ton compilateur toutes les informations nécessaire sur ta pile de couche pour qu'il te merge tout ça et te l'optimise au petit oignons, plutôt que de devoir parcourir une liste chaînée qui contient toujours les même valeurs.

    Parce que, ce que tu nous décris ressemble fortement à ce que l'on fait en C++ avec du Policy-based_design :

    #include <cstdio>
    template <class LowerLayer>
    struct l1 : LowerLayer {
     unsigned char val1 = 'a';
     unsigned char val2 = 'b';
     unsigned char val3 = 'c';
     unsigned char state = 0x00;
     unsigned char send(unsigned char* lower_state_jcomprend_pas_trop) {
     unsigned char tmp = 0x00;
     unsigned char lower_state;
     // ... plein de code ...
     switch (state) {
     case 2:
     // ici je considère que LowerLayer existe forcement,
     // si ce n'est pas le cas, on pourrai passer une
     // classe vide du genre NoLowerLayer avec des methodes
     // vides qui seront éliminée par le compilo, on
     // pourrai aussi tester avec
     // if (std::is_same<LowerLayer,NoLowerLayer>::value)
     // pour savoir s'il y a un niveau en dessous, ou faire
     // du super SFINAE de ouf. mais bon, KISS.
     tmp = this->LowerLayer::send(&lower_state);
     if (lower_state == 0xFF)
     state++;
     *lower_state_jcomprend_pas_trop = state;
     return tmp;
     }
     // ... encore plein de code ...
     }
    };
    // J'imagine que l2 ne peut être qu'utilisée en couche la plus basse.
    // Sinon il faudra juste une autre classe 'terminale' du genre NoLowerLayer.
    struct l2 {
     unsigned char val1 = 'Z';
     unsigned char val2 = 'F';
     unsigned char state = 0x00;
     unsigned char send(unsigned char* lower) {
     //...
     }
    };
    // Une couche intermédiaire, parce que je suis pas trop flemmard.
    template <class LowerLayer>
    struct l1_5 : LowerLayer {
     unsigned char send(unsigned char* lower) {
     unsigned char lower_state;
     *lower = 0x00;
     puts("coucou maman");
     return this->LowerLayer::send(&lower_state);
     }
    };
    template <class LayerStack>
    char send(LayerStack& stack) {
     unsigned char res = 0x00;
     stack.send(&res);
     if (res == 0xFF)
     return 0;
     return 1;
    }
    int main() {
     // définition de mes couches : l1 puis l1,5 puis l2
     // et instanciation.
     l1<l1_5<l2>> ma_pile;
     while (send(ma_pile));
     return 0;
    }