Черты типа, которые верны для всех const / volatile / подписанных / неподписанных версий фундаментального типа

Рассмотрим следующие тесты:

std::is_same<T, bool>::value
std::is_same<T, char>::value
std::is_same<T, short int>::value
std::is_same<T, int>::value
std::is_same<T, long int>::value
std::is_same<T, long long int>::value
std::is_same<T, float>::value
std::is_same<T, double>::value
std::is_same<T, long double>::value

Проблема в том, если T = const unsigned char, все тесты будут ложными, и я хотел бы этот std::is_same<T, char>::value чтобы быть правдой. Или если T = volatile signed long long int мне бы хотелось std::is_same<T, long long int>::value чтобы быть правдой. Как это сделать с type_traits ?

3

Решение

использование std::remove_cv удалять const а также volatile если представить:

std::is_same<std::remove_cv<T>::type, long long int>::value;
7

Другие решения

Ты можешь использовать станд :: remove_cv заботиться о const-volatile спецификаторах.

И вы можете использовать станд :: make_signed заботиться о подписанной / неподписанной проблеме. Хотя мне эта идея не особо нравится unsigned char действительно так же, как char? Кол-во).

std::is_same< std::make_signed< std::remove_cv<T> >, char >::value;

Будет верно для любого из char, unsigned char, const char, const unsigned charи изменчивые версии тех.

4

По вопросам рекламы [email protected]