#include <iostream>
#include <type_traits>

template <typename T> struct CSizex {};

struct CSize : public CSizex<int> {};

struct Logger
{
    template <typename T>
    Logger& operator<<(const CSizex<T>& size)
    {
    	std::cout << __PRETTY_FUNCTION__ << '\n';
        return *this;
    }

    template <typename T>
    typename std::enable_if<std::is_arithmetic<T>::value
                         || std::is_integral<T>::value 
                         || std::is_enum<T>::value, Logger&>::type
    operator<<(const T& value)
    {
    	std::cout << __PRETTY_FUNCTION__ << '\n';
        return *this;
    }
};

int main()
{
    CSize size;
    Logger() << size;
    Logger() << CSize();
    Logger() << CSizex<float>();
}