2013-02-03 28 views
16

C++ 11 udostępnia dwie klasy szablonów cech typowych: std::is_integer i std::is_integral. Nie potrafię jednak rozróżnić między nimi.Różnice między std :: is_integer i std :: is_integral?

Jaki typ, powiedzmy T, może uczynić std::is_integer<T>::value prawdziwym i spowodować, że std::is_integral<T>::value będzie fałszywy?

Odpowiedz

18

std::is_integer<T> nie istnieje.

Istnieje jednak, że istnieje std::numeric_limits<T>::is_integer.

Nie jestem świadomy żadnej znaczącej różnicy między std::numeric_limits<T>::is_integer a std::is_integral<T>. Ta ostatnia została zaprojektowana znacznie później i stała się standardem w C++ 11, podczas gdy pierwsza została wprowadzona w C++ 98.

+1

Nie widzę żadnej odpowiedzi na to pytanie. – Raffi

9

Nie ma typu T, który ma różne wyniki dla std::is_integral<T>::value i std::numeric_limits<T>::is_integer. Zacytować draft Standard:

3.9.1 Podstawowe typy [basic.fundamental]

7 Rodzaje bool, char, char16_t, char32_t, wchar_t i podpisane i niepodpisane typy całkowite są nazywane zbiorczo typy integralne. synonimem integralną typu jest liczbą całkowitą typu. [...]

18.3.2.4 numeric_limits członkowie [numeric.limits.members]

static constexpr bool is_integer; 

17 True jeśli typ jest liczba całkowita.

20.9.4.1 Podstawowe kategorie Typ [meta.unary.cat] (tabela 47)

template <class T> struct is_integral; 

T jest integralną typu (3.9.1)

1

Różnica polega na tym, że std::is_integral<T> rozpoznaje tylko dziesiętne liczby całkowite, w tym: boolcharchar16_tchar32_twchar_tshortintlonglong long. Podczas gdy std::numeric_limits<T>::is_integer rozpoznaje wszystkie te elementy, tak samo jak float . Przejrzyj te dwie strony, aby uzyskać więcej informacji: is_integer, is_integral

0

std::is_integral_v<T> Zwróci true tylko dla wbudowanych liczb całkowitych.

Standard zezwala na wyspecyfikowanie std::numeric_limits<T>::is_integer i zwraca true dla niestandardowych typów całkowych, takich jak boost::multiprecion::cpp_int.

Powiązane problemy