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

boostinteger_traitsをチェックしてください。

于 2009-12-14T15:20:39.240 に答える
3

この質問のintの最大値を参照してください-回答が「max」を使用した場所で「min」を使用することもできます

于 2009-12-14T15:21:01.070 に答える
0

<limits>テンプレートクラスに到達するためのヘッダーを含めますstd::numeric_limits。変数の数値型は、その型の他のいくつかの側面に加えて、関数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 に答える