Минимальное и максимальное значения для целочисленной переменной во время компиляции в C ++ - PullRequest
3 голосов
/ 14 декабря 2009

Существует ли простой, чистый способ определения во время компиляции значений max и min для переменной некоторой (в настоящий момент неизвестной) целочисленной переменной или типа? Используя шаблоны?

Например:

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

Ответы [ 5 ]

14 голосов
/ 14 декабря 2009

Используйте std :: numeric_limits, это именно для этого типа требований. Вы можете взглянуть на этот пример для использования.

9 голосов
/ 14 декабря 2009
3 голосов
/ 14 декабря 2009

См. Этот вопрос максимальное значение int - вы также можете использовать «min» в местах, где ответы использовали «max»

0 голосов
/ 21 сентября 2012

Если у вас есть доступ к 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, и все будут определены во время компиляции.

0 голосов
/ 14 декабря 2009

Включить заголовок <limits> для достижения класса шаблона std::numeric_limits. Числовой тип вашей переменной используется, чтобы найти специализацию этого шаблонного класса, которая обеспечит максимальное значение через функцию max() и минимальное значение через min(), кроме того к нескольким другим аспектам типа.

Обратите внимание, что интерпретация для минимум отличается для целочисленных типов и типов с плавающей запятой. Для первого это самое отрицательное значение для типа со знаком и ноль для типа без знака, но для второго это самое маленькое представимое значение, которое очень близко к нулю.

...