4

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

例如:

// 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
4

5 回答 5

14

使用 std::numeric_limits,它正好满足这种类型的要求。您可以查看此示例以了解用法。

于 2009-12-14T15:19:41.367 回答
9

查看boost integer_traits

于 2009-12-14T15:20:39.240 回答
3

请参阅this question maximum value of int - 您也可以在答案使用“max”的地方使用“min”

于 2009-12-14T15:21:01.070 回答
0

包含标题<limits>以到达模板类std::numeric_limits。变量的数字类型用于查找该模板类的特化,除了该类型的其他几个方面外,该模板类将通过 function 提供最大值,通过 提供max()最小值。min()

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

于 2009-12-14T15:31:40.867 回答
0

如果您有权访问 c++11,则可以使用decltype和的组合std::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();

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

于 2012-09-21T06:02:20.183 回答