begrenzte werte



  • gibt es eine möglichkeit
    ein typedef/classe zu machen das z.b. den datentyp int hat
    und man nur bestimmte zahlen wählen kann

    z.b.

    //uint6 hier definiren
    uint6 zahl; //uint6 ist ein unsigned int das die zahlen 0-6 speichern kann
    zahl = 10;  //hier soll der compieler ein error aus geben das der wert nur von 0-6 möglich ist
    


  • enum



  • hmm:

    template<typename T, std::size_t size>
    class data_ranged
    {
        T m_data;
        data_ranged& operator=(T const & data) { if (data > size) throw std::out_of_range("too big"); m_data = data; return *this; }
        operator T const&() const { return m_data; }
    };
    

    😛 Usw. muss du dann halt alle operatoren überladen ...



  • find

    enum{ ONE, TWO, THREE, FOUR, FIVE, SIX };
    

    irgendwie übersichtlicher 😉



  • enum zahl {NIX, EINS, ZWEI, DREI, VIER};
    
        zahl lol;
    
        lol = 3;
    

    $ g++ main.cpp
    main.cpp: In function »int main()«:
    main.cpp:22: Fehler: ungültige Umwandlung von »int« in »main()::zahl«

    Oder findest du das wirklich schön:

    enum zahl {NIX, EINS, ZWEI, DREI, VIER};
    
        zahl lol;
    
        lol = static_cast<zahl>(3);
    


  • du sollst einem enum auch keine ints zuweisen.



  • enum zahl {NIX, EINS, ZWEI, DREI, VIER};
    
        zahl lol;
    
        lol = EINS*ZWEI;
    

    $ g++ main.cpp
    main.cpp: In function »int main()«:
    main.cpp:22: Fehler: ungültige Umwandlung von »int« in »main()::zahl«

    Praktisch oder? Eine Zahl mit der ich nicht rechnen kann ...



  • stand in der anforderung, dass man mit dem wert auch direkt rechnen soll? nen enum ist ein wohl definierter parameter, der, wenn denn werte für eine berechnung nötig sein sollten, intern auf entsprechende werte gemappt werden kann.


  • Mod

    kiba91 schrieb:

    gibt es eine möglichkeit
    ein typedef/classe zu machen das z.b. den datentyp int hat
    und man nur bestimmte zahlen wählen kann

    z.b.

    //uint6 hier definiren
    uint6 zahl; //uint6 ist ein unsigned int das die zahlen 0-6 speichern kann
    zahl = 10;  //hier soll der compieler ein error aus geben das der wert nur von 0-6 möglich ist
    

    Es ist nicht möglich, derartige Fehler bereits beim Compilieren zu erkennen - das würde voraussetzen, dass man basierend auf der Konstantheit eines Ausdruckes überladen kann. Wenn ein Laufzeitfehler genügt, ist der Weg, den (D)Evil gezeigt hat gangbar, soweit es nur Integer betrifft:

    template<typename T, T min, T max >
    struct numeric_range
    {
        T value_;
        numeric_range(const T& value) : value_( min <= value && value <= max ? value : throw std::out_of_range( std::string() ) ) {}
        operator T const&() const { return value_; }
    };
    

    Irgendwelcher zusätzlicher Überladungen bedarf es hier nicht unbedingt. Mit enums ist so etwas nicht möglich, denn schon die einfache Zuweisung eines integers würde stets fehlschlagen, da hierfür ein Cast notwendig ist.



  • halts immer noch für übertrieben, auf so ein problem mit templates zu schiessen. wenn man die möglichen werte nicht zur compilezeit einschränkt (enum), dann muss sich der entwickler eh an den im kommentar dargelegten vertrag halten. und in dem fall tut es auch ein simples assert oder das direkte schmeissen einer exception in der gerufenen methode.



  • bei mir kann er out_of_range nicht finden
    `out_of_range' is not a member of `std'



  • Hast du den passenden Header eingebunden: <stdexception> ?


Anmelden zum Antworten