2013-02-03 14 views
16

C++ 11 fornisce due classi di modelli di caratteri di tipo: std::is_integer e std::is_integral. Tuttavia, non posso dire le differenze tra loro.Differenze tra std :: is_integer e std :: is_integral?

Che tipo, ad esempio T, può rendere vero std::is_integer<T>::value e rendere std::is_integral<T>::value falso?

risposta

18

std::is_integer<T> non esiste.

Detto questo, std::numeric_limits<T>::is_integer esiste.

Non sono a conoscenza di differenze significative tra std::numeric_limits<T>::is_integer e std::is_integral<T>. Quest'ultimo fu progettato molto più tardi e divenne standard in C++ 11, mentre il primo fu introdotto in C++ 98.

+1

Non vedo alcuna risposta alla domanda. – Raffi

9

Non esiste alcun tipo T che ha risultati diversi per std::is_integral<T>::value e std::numeric_limits<T>::is_integer. Per citare le draft Standard:

3.9.1 tipi fondamentali [basic.fundamental]

7 Tipi bool, char, char16_t, char32_t, wchar_t, e il sottoscritto e tipi interi senza segno sono chiamati collettivamente tipi integrali. Un sinonimi per tipo integrale è tipo intero. [...]

18.3.2.4 numeric_limits membri [numeric.limits.members]

static constexpr bool is_integer; 

17 Vero se il tipo è numero intero.

20.9.4.1 categorie tipo primario [meta.unary.cat] (tabella 47)

template <class T> struct is_integral; 

T è un tipo intero (3.9.1)

1

La differenza è che std::is_integral<T> riconoscerà solo i numeri interi decimali compreso boolcharchar16_tchar32_twchar_tshortintlonglong long. Mentre std::numeric_limits<T>::is_integer riconoscerà tutti quelli anche come floatdouble. Guarda queste due pagine per maggiori informazioni: is_integer, is_integral

0

std::is_integral_v<T> restituirà true solo per interi incorporati.

Lo standard consente di specializzare std::numeric_limits<T>::is_integer e restituire true per tipi di integrale personalizzati come boost::multiprecion::cpp_int.

Problemi correlati