#include <iostream>
#include <type_traits>
using namespace std;
enum type_t {
integer,
float_v,
bool_v,
other
};
template<typename T>
struct get_type
{
static constexpr type_t type = is_same<T,bool>:: value ? bool_v :
is_integral<T>::value ? integer :
is_same<T,float>::value ? float_v : other;
};
int main(int argc, char * argv[])
{
cout << get_type<long>::type << endl;
cout << get_type<double>::type << endl;
cout << get_type<float>::type << endl;
cout << get_type<bool>::type << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKZW51bSB0eXBlX3QgewogICBpbnRlZ2VyLAogICBmbG9hdF92LAogICBib29sX3YsCiAgIG90aGVyCn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgZ2V0X3R5cGUKewogICAgc3RhdGljIGNvbnN0ZXhwciB0eXBlX3QgdHlwZSA9IGlzX3NhbWU8VCxib29sPjo6IHZhbHVlID8gYm9vbF92IDoKICAgICAgICAgaXNfaW50ZWdyYWw8VD46OnZhbHVlID8gaW50ZWdlciA6IAogICAgICAgICBpc19zYW1lPFQsZmxvYXQ+Ojp2YWx1ZSA/IGZsb2F0X3YgOiBvdGhlcjsKfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKQp7CiAgICBjb3V0IDw8IGdldF90eXBlPGxvbmc+Ojp0eXBlIDw8IGVuZGw7CiAgICBjb3V0IDw8IGdldF90eXBlPGRvdWJsZT46OnR5cGUgPDwgZW5kbDsKICAgIGNvdXQgPDwgZ2V0X3R5cGU8ZmxvYXQ+Ojp0eXBlIDw8IGVuZGw7CiAgICBjb3V0IDw8IGdldF90eXBlPGJvb2w+Ojp0eXBlIDw8IGVuZGw7Cn0K