Битовый расчет в порядке, но его можно улучшить, используя CHAR_BIT
вместо 8
, см. этот вопрос .
Для получения другой информации вы можете использовать <type_traits>
, в частности:
std::is_signed
/ std::is_unsigned
std::is_integral
/ std::is_floating_point
Обратите внимание, что типы с плавающей запятой всегда подписаны, но std::is_signed
вернет false, потому что он проверяет, является ли тип знаком integer .
Также обратите внимание, что char
- это просто еще один целочисленный тип, поэтому нет стандартной черты типа, которая бы специально проверяла это, но вы можете использовать простой std::is_same<T, char>
.
В коде это может выглядеть следующим образом:
#include <iostream>
#include <type_traits>
#include <climits> // CHAR_BIT
template<class T>
void f(){
std::cout << sizeof(T) * CHAR_BIT << "-";
if(std::is_integral<T>::value){
if(std::is_signed<T>::value)
std::cout << "S";
else
std::cout << "U";
std::cout << "-";
if(std::is_same<T, char>::value)
std::cout << "C";
else
std::cout << "I";
}else if(std::is_floating_point<T>::value){
std::cout << "S-F";
}
std::cout << "\n";
}
Живой пример на Ideone.
Обратите внимание, что bool
считается целым числом без знака, но это легко исправить. Также обратите внимание, что компилятор выдаст кучу предупреждений относительно «условного выражения является константой», так что это может быть улучшено, но этого должно быть достаточно для демонстрации.