【问题标题】:Bounded primitives有界基元
【发布时间】:2025-12-08 07:40:01
【问题描述】:

在 Java 或 C++ 中有没有类似有限原语的东西?我想要的是一个像浮点数或双精度数一样的变量,除了它有一个用户可设置的最小值和最大值。

例如,如果我要设置这样一个浮点变量,使其绑定在 0 到 100 之间,我可以尝试将其设置为任意数字,并且通常以与我相同的方式使用它原始的,除了当分配给它的值大于允许的最大值时,它会假定最大值,当它小于最小值时,它将假定最小值。我希望能够对其进行基本运算,例如加法、乘法和减法 - 特别是使用我将用于类似正常变量的运算符。

这些是否存在于某个图书馆的某个地方?

【问题讨论】:

  • 您可以转换为内部浮点值 Y,其中 Y = FlotingPointMaximum/Limit * X

标签: java c++ operator-overloading primitive


【解决方案1】:

你可以为此设计这样一个类(在 C++ 中)。基本设计如下:-

class Bound
{
private:
  const int min = 10;
  const int max = 100;
  int var;
public:
  Bound( int x )
  {
    if ( x > max )
       var = max;
    else if ( x < min )
       var = min;
    else
       var = x;
  }

  Bound& operator == ( int x )
  {
    // On same line as constructor 
  }
};

您可以将其转换为模板以支持其他数据类型。

【讨论】:

  • template&lt;class T, T min, T max&gt; class Bound {/*...*/};...不要忘记与T的隐式转换,作为免费函数。
  • 我希望在超出范围的情况下,该类将触发断言失败(或者可能是异常),而不仅仅是裁剪值。 (当然,您需要所有重载的运算符,包括 Bound, BoundBound, intint, Bound。以及其他任何有意义的运算符。)
  • @Jemes Question 明确表示,如果价值更大,它会假设 max ... 所以,我没有想到断言/异常。
【解决方案2】:

没有这样的Buildins。此外,Java 不允许运算符重载,因此您永远无法编写如下内容:

myBoundedInt i = 13;

而是:

myBoundedInt i = new myBoundedInt(13);
//...
i.setValue(42);

据我所知,Dlang 确实为类提供了内置断言,以保证在对象的整个生命周期内满足某些条件。也许你想研究一下。

【讨论】: