These structs only work on arithmetic types. The type must be constructable by an int and be less-than comparable.
In the Example of is_signed and is_unsigned the signedness of char is tested. Since it is implementation-defined whether or not char is signed, this is a way to find out how it is defined. Either b1 will be true and b2 false, or vice-versa.
bool b1 = is_signed<char>::value; bool b2 = is_unsigned<char>::value;