How can the allowed range of an integer be restricted with compile time errors?

后端 未结 5 1736
失恋的感觉
失恋的感觉 2020-12-09 22:51

I would like to create a type that is an integer value, but with a restricted range. Attempting to create an instance of this type with a value outside the allowable range s

5条回答
  •  醉话见心
    2020-12-09 23:14

    Yes but it's clunky:

    // Defining as template but the main class can have the range hard-coded
    template 
    class limited_int {
    private:
        limited_int(int i) : value_(i) {}
        int value_; 
    public:
        template  // This needs to be a template for compile time errors
        static limited_int make_limited() { 
            static_assert(Val >= Min && Val <= Max, "Bad! Bad value.");
            // If you don't have static_assert upgrade your compiler or use:
            //typedef char assert_in_range[Val >= Min && Val <= Max];
            return Val;
        }
    
        int value() const { return value_; }
    };
    
    typedef limited_int<0, 9> digit;
    int main(int argc, const char**) 
    {
    
        // Error can't create directly (ctor is private)
        //digit d0 = 5; 
    
        // OK
        digit d1 = digit::make_limited<5>(); 
    
        // Compilation error, out of range (can't create zero sized array)
        //digit d2 = digit::make_limited<10>(); 
    
        // Error, can't determine at compile time if argc is in range
        //digit d3 = digit::make_limited(); 
    }
    

    Things will be much easier when C++0x is out with constexpr, static_assert and user defined literals.

提交回复
热议问题