【问题标题】:Min and Max values for integer variable at compile time in C++C++ 编译时整数变量的最小值和最大值
【发布时间】:2010-12-26 11:12:51
【问题描述】:

是否有一种简单、干净的方法可以在编译时确定某个(否则目前未知)整数变量或类型的变量的最大值和最小值?使用模板?

例如:

// Somewhere in a large project is:
typedef unsigned long XType;
typedef char YType;
// ...

// Somewhere else
   XType a;
   YType b;
   LONGLONG c,d,e,f;
   c = MinOfType(a); // Same as c = 0;
   d = MaxOfType(a); // Same as d = 0xffffffff;
   e = MinOfType(b); // Same as e = -128;
   f = MaxOfType(b); // Same as f = 127;
// Also would be nice
   e = MinOfType(YType); // Same as e = -128; // Using the typename directly
// Or perhaps
   e = MinOfType<YType>(); // Same as e = -128; // Using the typename directly

【问题讨论】:

  • 编译时无法知道变量的值,但常量可以。
  • 上述代码中不需要变量的“值”。但是,在我的示例中,变量的类型不是在编译时已知的。这些变量不是多态类,只是基本整数类型之一。或者我错过了什么(很可能)。我想我有 numeric_limits 用于直接使用类型名的情况。现在我可以做类似的事情: e=numeric_limits::max(); ?
  • 在编译时,编译器肯定知道类型“a”或“b”。否则编译器根本无法使用这些变量生成代码。

标签: c++ templates compile-time


【解决方案1】:

使用 std::numeric_limits,它正是针对这种类型的要求。你可以看看这个example的用法。

【讨论】:

  • AFAIK,但那些不是编译时(如果 OP 自己意识到他到底想要什么)。
  • 不是编译时,但如果启用优化,则相当接近。
  • RaphaelSP:如果实际需要编译时间,例如模板参数或枚举器,那么启用什么优化都无关紧要——表达式是或不是。与 C++0x 中的 constexprs 进行比较。
  • 好点。我只是将“编译时”翻译成“快速”(鉴于代码 sn-p 没有合理使用“编译时”位)。
【解决方案2】:

【讨论】:

    【解决方案3】:

    看到这个问题maximum value of int - 你也可以在答案使用“max”的地方使用“min”

    【讨论】:

      【解决方案4】:

      包含标题&lt;limits&gt; 以到达模板类std::numeric_limits。变量的数值类型用于查找该模板类的特化,该类将通过函数 max() 提供最大值,通过 min() 提供最小值,以及该类型的其他几个方面。

      请注意,对于整数和浮点类型,minimum 的解释是不同的。对于前者,它是有符号类型的最负值,无符号类型为零,但对于后者,它是可表示的最小值,非常接近于零。

      【讨论】:

      • 错了。现在不是编译时间。
      • True,并且上面的客户端代码无法区分运行时的评估和编译时。我见过的numeric_limits 的所有实现都是公开在编译时定义的常量的函数,但我不认为标准要求这些值通过函数而不是常量成员值公开是错误的——在特别是为了适应浮点类型或其他一些非 ICE。
      【解决方案5】:

      如果您可以访问 c++11,则可以使用 decltypestd::numeric_limits 的组合。重写示例代码如下所示:

      #include <limits>
      
      typedef unsigned long XType;
      typedef char YType;
      
      XType a;
      YType b;
      LONGLONG c,d,e,f;
      c = std::numeric_limits< decltype(a) >::min(); // Same as c = 0;
      d = std::numeric_limits< decltype(a) >::max(); // Same as d = 0xffffffff;
      e = std::numeric_limits< decltype(b) >::min(); // Same as e = -128;
      f = std::numeric_limits< decltype(b) >::max(); // Same as f = 127;
      e = std::numeric_limits< YType >::min(); // Same as e = -128; // Using the typename directly
      

      decltype 将从表达式中提取类型,在这种情况下获取变量类型,并让您在其他需要类型(例如模板)的地方使用它。这一切都发生在编译时,因此您可以将其分配给constexpr

      constexpr decltype(a) g = std::numeric_limits< decltype(a) >::min();
      

      这里的ga 的类型相同,值为0,并且都在编译时确定。

      【讨论】:

        猜你喜欢
        • 2012-08-09
        • 2013-06-27
        • 1970-01-01
        • 2013-10-28
        • 1970-01-01
        • 2011-10-24
        • 2012-11-20
        • 1970-01-01
        • 2017-02-13
        相关资源
        最近更新 更多