2013-05-11 7 views
3

Рассмотрим следующие тесты:Тип черты Wich верно для всех сопз/летучего/подпись/без знака версии фундаментального типа

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?

ответ

7

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

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

Вы можете использовать std::remove_cv позаботиться о константных энергонезависимых спецификаторах.

И вы можете использовать std::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 и летучих версий тех.

+0

Я проектирую класс для определения моделей данных файлов, созданных гетерогенной системой, а подписи/неподписанные версии типов кодируются с таким же количеством байтов. – Vincent

+0

'unsigned char',' signed char' и регулярный 'char' являются тремя различными типами (см. §3.1.1.1). Поэтому пример не будет прав, поскольку вы создаете 'подписанный символ' и сравниваете его с регулярным' char'. Не стесняйтесь протестировать его: https://ideone.com/T8QdYw –