#include <iostream>
#include <type_traits>
class someOtherClass
{
public:
someOtherClass()
: a(0)
, b(1.0f)
, c(2.0)
{}
int a;
float b;
double c;
};
class logger
{
public:
// Specific case for handling a complex object
logger& operator << ( const someOtherClass& rObject )
{
std::cout << rObject.a << std::endl;
std::cout << rObject.b << std::endl;
std::cout << rObject.c << std::endl;
return *this;
}
// [other class specific implementations]
// Template for handling pointers which might be null
template< typename _T >
logger& operator << ( const _T* pBar )
{
if ( pBar )
{
std::cout << "Pointer handled:" << std::endl;
return *this << *pBar;
}
else
std::cout << "null" << std::endl;
return *this;
}
// Template for handling simple types.
template< typename _T , typename = typename ::std::enable_if_t<!std::is_pointer<_T>::value> >
logger& operator << ( const _T& rBar )
{
std::cout << "Reference: " << rBar << std::endl;
return *this;
}
};
int main(int argc, char* argv[])
{
logger l;
someOtherClass soc;
someOtherClass* pSoc = &soc;
l << soc;
l << pSoc;
pSoc = nullptr;
l << pSoc;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpjbGFzcyBzb21lT3RoZXJDbGFzcwp7CnB1YmxpYzoKICAgIHNvbWVPdGhlckNsYXNzKCkKICAgICAgICA6IGEoMCkKICAgICAgICAsIGIoMS4wZikKICAgICAgICAsIGMoMi4wKQogICAge30KICAgIGludCBhOwogICAgZmxvYXQgYjsKICAgIGRvdWJsZSBjOwp9OwoKY2xhc3MgbG9nZ2VyCnsKcHVibGljOgogICAgLy8gU3BlY2lmaWMgY2FzZSBmb3IgaGFuZGxpbmcgYSBjb21wbGV4IG9iamVjdAogICAgbG9nZ2VyJiBvcGVyYXRvciA8PCAoIGNvbnN0IHNvbWVPdGhlckNsYXNzJiByT2JqZWN0ICkKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgck9iamVjdC5hIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBzdGQ6OmNvdXQgPDwgck9iamVjdC5iIDw8IHN0ZDo6ZW5kbDsKICAgICAgICBzdGQ6OmNvdXQgPDwgck9iamVjdC5jIDw8IHN0ZDo6ZW5kbDsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgLy8gW290aGVyIGNsYXNzIHNwZWNpZmljIGltcGxlbWVudGF0aW9uc10KCiAgICAvLyBUZW1wbGF0ZSBmb3IgaGFuZGxpbmcgcG9pbnRlcnMgd2hpY2ggbWlnaHQgYmUgbnVsbAogICAgdGVtcGxhdGU8IHR5cGVuYW1lIF9UID4KICAgIGxvZ2dlciYgb3BlcmF0b3IgPDwgKCBjb25zdCBfVCogcEJhciApCiAgICB7CiAgICAgICAgaWYgKCBwQmFyICkKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiUG9pbnRlciBoYW5kbGVkOiIgPDwgc3RkOjplbmRsOwogICAgICAgICAgICByZXR1cm4gKnRoaXMgPDwgKnBCYXI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJudWxsIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgcmV0dXJuICAqdGhpczsKICAgIH0KCiAgICAvLyBUZW1wbGF0ZSBmb3IgaGFuZGxpbmcgc2ltcGxlIHR5cGVzLgogICAgdGVtcGxhdGU8IHR5cGVuYW1lIF9UICwgdHlwZW5hbWUgPSB0eXBlbmFtZSA6OnN0ZDo6ZW5hYmxlX2lmX3Q8IXN0ZDo6aXNfcG9pbnRlcjxfVD46OnZhbHVlPiA+CiAgICBsb2dnZXImIG9wZXJhdG9yIDw8ICggY29uc3QgX1QmIHJCYXIgKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiUmVmZXJlbmNlOiAiIDw8IHJCYXIgPDwgc3RkOjplbmRsOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KfTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pCnsKICAgIGxvZ2dlciBsOwogICAgc29tZU90aGVyQ2xhc3Mgc29jOwogICAgc29tZU90aGVyQ2xhc3MqIHBTb2MgPSAmc29jOwogICAgbCA8PCBzb2M7CiAgICBsIDw8IHBTb2M7CiAgICBwU29jID0gbnVsbHB0cjsKICAgIGwgPDwgcFNvYzsKICAgIHJldHVybiAwOwp9