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