簡體   English   中英

如何在c ++中為整數設置最小/最大值,其中++和-以及常規數學遵循您設置的限制?

[英]How to set min/max values for an integer, where `++` and `--` and general math obeys the limits you set, in c++?

我不希望用大量的if語句來填充我的代碼,我想知道一種用於設置整數限制的干凈方法,當遍歷這些限制時,該方法仍將包裝其值。

例如

int i(9998);
setMinMax(i,-27315, 10000); // Absolute Zero - Boiling Point of water
i++; // ==  9999
i++; // ==  10000
i++; // == -27315

如果最小-最大值可以是動態的,那將是理想的。 我不介意制作新類型或運算符重載。 我只想避免做這樣的事情:

int i = foo();
int j = bar();
int min(-27315);
int max(10000);
i += j;
     if (i==min-1) {i=max}
else if (i==max+1) {i=min}
else if (i>max) {i=min+(i-max)}
// more stupid code

謝謝。

可以做到這一點,但是不能使用原始int s完成。 您需要實現自己的類類型,該類類型可以重載各種算術運算符,以使外觀看起來像int。 這是實現此目標的一種方法:

#include <limits> // for numeric_limits

struct RangedInt {
private:
    int m_min = std::numeric_limits<int>::min();
    int m_max = std::numeric_limits<int>::max();
    int m_val = 0;
public:
    RangedInt(int value = 0) : m_val(value) {}

    void setMinMax(int min, int max){
        m_min = min;
        m_max = max;
        m_val = std::min(std::max(m_val, m_min), m_max);
    }

    // pre-increment
    RangedInt& operator++(){
        m_val++;
        if (m_val > m_max) m_val = m_min;
        return *this;
    }

    // post-increment
    RangedInt operator++(int){
        RangedInt tmp {*this}; // create temporary with old value
        operator++(); // perform increment
        return tmp; // return temporary
    }

    // pre-decrement
    RangedInt& operator--(){
        m_val--;
        if (m_val < m_min) m_val = m_max;
        return *this;
    }

    // post-decrement
    RangedInt operator--(int){
        RangedInt tmp {*this}; // create temporary with old value
        operator--(); // perform decrement
        return tmp; // return temporary
    }

    // this can be extended to implement the following operators
    RangedInt operator+(const RangedInt& x);
    RangedInt operator+(int x);
    RangedInt operator-(const RangedInt& x);
    RangedInt operator-(int x);
    RangedInt& operator+=(const RangedInt& x);
    RangedInt& operator+=(int x);
    RangedInt& operator-=(const RangedInt& x);
    RangedInt& operator-=(int x);
    // and lots more, for *, /, unary +/-, etc...

    // convenient conversion to int:
    explicit operator int(){
        return m_val;
    }
};

現在,以上代碼使您可以編寫以下代碼:

RangedInt i = 9998;
i.setMinMax(-27135, 10000);
std::cout << (int)i << '\n'; // 9998
i++;
std::cout << (int)i << '\n'; // 9999
i++;
std::cout << (int)i << '\n'; // 10000
i++;
std::cout << (int)i << '\n'; // -27135

可以使用模板擴展此方法,以使其適用於任何數字類型,而不僅限於int ,如果在編譯時已知最小值和最大值,並且您擔心內存占用,則也可以將最小值和最大值轉換為模板參數。

您可能想看看JonathanMüller的type_safe 和相關的博客文章 它提供了一個框架(可以做很多事情)來在這里尋找您想要的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM