C++11 にはstd::is_integer
、 とstd::is_integral
. ただし、それらの違いはわかりません。
どの型、たとえば T がstd::is_integer<T>::value
true になり、std::is_integral<T>::value
false になることができますか?
C++11 にはstd::is_integer
、 とstd::is_integral
. ただし、それらの違いはわかりません。
どの型、たとえば T がstd::is_integer<T>::value
true になり、std::is_integral<T>::value
false になることができますか?
std::is_integer<T>
存在しません。
そうは言っても、std::numeric_limits<T>::is_integer
存在します。
std::numeric_limits<T>::is_integer
と の間に大きな違いがあることは認識していませんstd::is_integral<T>
。後者はずっと後に設計され、C++11 で標準になりましたが、前者は C++98 で導入されました。
と でT
結果が異なる型はありません。ドラフト標準を引用するには:std::is_integral<T>::value
std::numeric_limits<T>::is_integer
3.9.1 基本型 [basic.fundamental]
7 型 bool、char、char16_t、char32_t、wchar_t、および符号付き整数型と符号なし整数型をまとめて整数型と呼びます。整数型の同義語は整数型です。[...]
18.3.2.4 numeric_limits メンバー [numeric.limits.members]
static constexpr bool is_integer;
17 型が整数の場合は真。
20.9.4.1 プライマリ タイプ カテゴリ [meta.unary.cat] (表 47)
template <class T> struct is_integral;
T は整数型です (3.9.1)
std::is_integral_v<T>
組み込み整数に対してのみ true を返します。
標準では、 のstd::numeric_limits<T>::is_integer
ようなカスタムの整数型に対して特殊化して true を返すことができますboost::multiprecion::cpp_int
。
std::is_integral<T>
とstd::numeric_limits<T>::is_integer
同じではありません。たとえばboost::multiprecision
、big int は別の方法で処理されます。
これは、対応する問題からのものです。
is_integral
型の性質に関する情報を返します。これは「ネイティブ」整数型に対してのみ真であり、クラス型に対して真であってはなりません。つまりis_integer
、 とis_class
は相互に排他的です。
numeric_limits
一方、タイプの動作に関する情報を返します-必要に応じて特定の概念をモデル化するかどうか-UDT に特化する必要があります。些細な移動/コピー/初期化など、他の多くのことも当てはまることを意味するis_integer
ため、UDTに特化するとコードが破損することに注意してください 。is_integer