#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>();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IENTaXpleCB7fTsKCnN0cnVjdCBDU2l6ZSA6IHB1YmxpYyBDU2l6ZXg8aW50PiB7fTsKCnN0cnVjdCBMb2dnZXIKewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICBMb2dnZXImIG9wZXJhdG9yPDwoY29uc3QgQ1NpemV4PFQ+JiBzaXplKQogICAgewogICAgCXN0ZDo6Y291dCA8PCBfX1BSRVRUWV9GVU5DVElPTl9fIDw8ICdcbic7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19hcml0aG1ldGljPFQ+Ojp2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX2VudW08VD46OnZhbHVlLCBMb2dnZXImPjo6dHlwZQogICAgb3BlcmF0b3I8PChjb25zdCBUJiB2YWx1ZSkKICAgIHsKICAgIAlzdGQ6OmNvdXQgPDwgX19QUkVUVFlfRlVOQ1RJT05fXyA8PCAnXG4nOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgQ1NpemUgc2l6ZTsKICAgIExvZ2dlcigpIDw8IHNpemU7CiAgICBMb2dnZXIoKSA8PCBDU2l6ZSgpOwogICAgTG9nZ2VyKCkgPDwgQ1NpemV4PGZsb2F0PigpOwp9