#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> ( ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZWluZm8+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPGN4eGFiaS5oPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgcHJpbnRfdHlwZV9pbmZvICgpIHsKICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogIGludCBzdGF0dXM7CiAgYXV0byB0eXBlX25hbWUgPSBhYmk6Ol9fY3hhX2RlbWFuZ2xlKHR5cGVpZCgoVCgpKSkubmFtZSgpLCAwLCAwLCAmc3RhdHVzKTsKICBjb3V0IDw8IHR5cGVfbmFtZSA8PCAiIGlzICIgCiAgICAgICA8PCAoaXNfaW50ZWdyYWw8VD46OnZhbHVlID8gIiIgOiAibm90ICIpIDw8ICJpbnRlZ3JhbCwgIgogICAgICAgPDwgKGlzX3NpZ25lZDxUPjo6dmFsdWUgPyAiIiA6ICJ1biIpIDw8ICJzaWduZWQsICIKICAgICAgIDw8IChpc191bnNpZ25lZDxUPjo6dmFsdWUgPyAidW4iIDogIiIpIDw8ICJzaWduZWQiCiAgICAgICA8PCBlbmRsOwp9CgppbnQgbWFpbigpIHsKICBlbnVtIGZvbyA6IGludCB7fTsKICBlbnVtIGJhciA6IHVuc2lnbmVkIHt9OwoKICBwcmludF90eXBlX2luZm88aW50PigpOwogIHByaW50X3R5cGVfaW5mbzx1bnNpZ25lZD4oKTsKICBwcmludF90eXBlX2luZm88Zm9vPigpOwogIHByaW50X3R5cGVfaW5mbzxiYXI+KCk7Cn0=
stdout
int is integral, signed, signed
unsigned int is integral, unsigned, unsigned
main::foo is not integral, unsigned, signed
main::bar is not integral, unsigned, signed