32

C++11 にはstd::is_integer、 とstd::is_integral. ただし、それらの違いはわかりません。

どの型、たとえば T がstd::is_integer<T>::valuetrue になり、std::is_integral<T>::valuefalse になることができますか?

4

5 に答える 5

33

std::is_integer<T>存在しません。

そうは言っても、std::numeric_limits<T>::is_integer存在します。

std::numeric_limits<T>::is_integerと の間に大きな違いがあることは認識していませんstd::is_integral<T>。後者はずっと後に設計され、C++11 で標準になりましたが、前者は C++98 で導入されました。

于 2013-02-03T20:01:09.817 に答える
18

と でT結果が異なる型はありません。ドラフト標準を引用するには:std::is_integral<T>::valuestd::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)

于 2013-02-05T08:05:55.973 に答える
4

std::is_integral_v<T>組み込み整数に対してのみ true を返します。

標準では、 のstd::numeric_limits<T>::is_integerようなカスタムの整数型に対して特殊化して true を返すことができますboost::multiprecion::cpp_int

于 2018-02-27T10:14:43.747 に答える
1

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

于 2020-05-02T09:53:06.363 に答える