#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;
}