• # Beurk les conversions implicites

    Posté par (site web personnel) . En réponse au journal Le bon sens et le C++. Évalué à 4.

    Imaginez une API qui permet de sérialiser des données binaires en fonction du type en entrée :

    #include <iostream>
    #include <cstdint>
    void pack(uint8_t x) { puts("uint8_t"); }
    void pack(uint16_t x) { puts("uint16_t"); }
    void pack(uint32_t x) { puts("uint32_t"); }
    void pack(uint64_t x) { puts("uint64_t"); }
    void pack(int8_t x) { puts("int8_t"); }
    void pack(int16_t x) { puts("int16_t"); }
    void pack(int32_t x) { puts("int32_t"); }
    void pack(int64_t x) { puts("int64_t"); }
    void pack(float x) { puts("float"); }
    int main() {
     pack(1);
     return 0;
    }

    Résultat possible :

    $ ./a.out
    int32_t
    

    Du coup, si on veut sérialiser des entiers spécifiques à la suite on doit forcer un cast.

    pack(static_cast<uint8_t>(10));
    pack(static_cast<uint16_t>(1664));

    Perso je vote pour des spécialisations de template ou des noms explicites (comme packu64 mais moins C++/template/metaprogramming friendly)

    AI is a mental disorder