#include <iostream>
#include <type_traits>
using namespace std;
template<typename T>
const char* describe(T,
typename enable_if<is_integral<T>::value>::type* = 0)
{
return "integral";
}
template<typename T>
const char* describe(T,
typename std::enable_if<is_floating_point<T>::value>::type* = 0)
{
return "floating_point";
}
template<typename T>
const char* describe(T,
typename std::enable_if<!std::is_integral<T>::value && !std::is_floating_point<T>::value && std::is_pod<T>::value>::type* = 0)
{
return "pod";
}
struct pod {};
int main(void)
{
std::cout << describe(7) << std::endl;
std::cout << describe(7.0f) << std::endl;
std::cout << describe(pod()) << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgIAp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjb25zdCBjaGFyKiBkZXNjcmliZShULAoJCQkJCSB0eXBlbmFtZSBlbmFibGVfaWY8aXNfaW50ZWdyYWw8VD46OnZhbHVlPjo6dHlwZSogPSAwKQp7CglyZXR1cm4gImludGVncmFsIjsKfQogICAgIAp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjb25zdCBjaGFyKiBkZXNjcmliZShULAoJCQkJCSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWU+Ojp0eXBlKiA9IDApCnsKICAgIHJldHVybiAiZmxvYXRpbmdfcG9pbnQiOwp9CiAgICAgCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNvbnN0IGNoYXIqIGRlc2NyaWJlKFQsCgkJCQkJIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSAmJiAhc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgJiYgc3RkOjppc19wb2Q8VD46OnZhbHVlPjo6dHlwZSogPSAwKQp7CiAgICByZXR1cm4gInBvZCI7Cn0KCnN0cnVjdCBwb2Qge307CiAgICAgCmludCBtYWluKHZvaWQpCnsKICAgIHN0ZDo6Y291dCA8PCBkZXNjcmliZSg3KSA8PCBzdGQ6OmVuZGw7CiAgICBzdGQ6OmNvdXQgPDwgZGVzY3JpYmUoNy4wZikgPDwgc3RkOjplbmRsOwogICAgc3RkOjpjb3V0IDw8IGRlc2NyaWJlKHBvZCgpKSA8PCBzdGQ6OmVuZGw7Cn0=