fork download
  1. #include <cstring>
  2. #include <iostream>
  3. #include <type_traits>
  4.  
  5. constexpr const char* name[] = {
  6. "uint1", "uint2", "uint4", "uint8", "uint16",
  7. "int1", "int2", "int4", "int8", "int16"
  8. };
  9.  
  10. constexpr size_t log2(size_t n) {
  11. return (n<2) ? 0 : 1+log2(n/2);
  12. }
  13.  
  14. template <class T>
  15. constexpr std::enable_if_t<std::is_arithmetic<T>::value, const char *> make_type_name() {
  16. return name[std::is_signed<T>::value * 5 + log2(sizeof(T))];
  17. }
  18.  
  19. static_assert(std::strcmp(make_type_name<int>(), make_type_name<int32_t>()) == 0);
  20.  
  21. int main() {
  22. std::cout << log2(sizeof(int)) << ' ' << make_type_name<int>();
  23. return 0;
  24. }
  25.  
Success #stdin #stdout 0s 4236KB
stdin
Standard input is empty
stdout
2 int4