#include <iostream>
#include <typeinfo>
#include <type_traits>
#include <cxxabi.h>

template <typename T>
void print_type_info () {
  using namespace std;
  int status;
  auto type_name = abi::__cxa_demangle(typeid((T())).name(), 0, 0, &status);
  cout << type_name << " is " 
       << (is_integral<T>::value ? "" : "not ") << "integral, "
       << (is_signed<T>::value ? "" : "un") << "signed, "
       << (is_unsigned<T>::value ? "un" : "") << "signed"
       << endl;
}

int main() {
  enum foo : int {};
  enum bar : unsigned {};

  print_type_info<int>();
  print_type_info<unsigned>();
  print_type_info<foo>();
  print_type_info<bar>();
}