#include <iostream>
#include <string>
template<typename X, typename T>
void extend_exception( X& ex, T&& value )
{ex << value << std::endl;}
template<typename X>
void extend_exception( X& ex, const std::string& value )
{ex << "STRING: " << value << std::endl;}
template<typename X>
void extend_exception(X& ex, std::string& value )
{const std::string& v=value;extend_exception(ex, v);}
template<typename X>
void extend_exception(X& ex, std::string&& value )
{const std::string& v=value;extend_exception(ex, v);}
template<typename X, typename T0, typename T1, typename ... TR>
void extend_exception( X& ex, T0&& p0, T1&& p1, TR&& ... rest )
{
extend_exception( ex, std::forward<T0>(p0) );
extend_exception( ex, std::forward<T1>(p1), std::forward<TR>(rest)... );
}
int main()
{
extend_exception( std::cout, std::string( "Happy" ) );
std::string var( "var" );
extend_exception( std::cout, var );
extend_exception( std::cout, var, std::string( "Combo" ), const_cast<std::string const&>(var));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGU8dHlwZW5hbWUgWCwgdHlwZW5hbWUgVD4Kdm9pZCBleHRlbmRfZXhjZXB0aW9uKCBYJiBleCwgVCYmIHZhbHVlICkKe2V4IDw8IHZhbHVlIDw8IHN0ZDo6ZW5kbDt9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBYPgp2b2lkIGV4dGVuZF9leGNlcHRpb24oIFgmIGV4LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUgKQp7ZXggPDwgIlNUUklORzogIiA8PCB2YWx1ZSA8PCBzdGQ6OmVuZGw7fQoKdGVtcGxhdGU8dHlwZW5hbWUgWD4Kdm9pZCBleHRlbmRfZXhjZXB0aW9uKFgmIGV4LCBzdGQ6OnN0cmluZyYgdmFsdWUgKQp7Y29uc3Qgc3RkOjpzdHJpbmcmIHY9dmFsdWU7ZXh0ZW5kX2V4Y2VwdGlvbihleCwgdik7fQoKdGVtcGxhdGU8dHlwZW5hbWUgWD4Kdm9pZCBleHRlbmRfZXhjZXB0aW9uKFgmIGV4LCBzdGQ6OnN0cmluZyYmIHZhbHVlICkKe2NvbnN0IHN0ZDo6c3RyaW5nJiB2PXZhbHVlO2V4dGVuZF9leGNlcHRpb24oZXgsIHYpO30KCnRlbXBsYXRlPHR5cGVuYW1lIFgsIHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgLi4uIFRSPgp2b2lkIGV4dGVuZF9leGNlcHRpb24oIFgmIGV4LCBUMCYmIHAwLCBUMSYmIHAxLCBUUiYmIC4uLiByZXN0ICkKewogICAgZXh0ZW5kX2V4Y2VwdGlvbiggZXgsIHN0ZDo6Zm9yd2FyZDxUMD4ocDApICk7CiAgICBleHRlbmRfZXhjZXB0aW9uKCBleCwgc3RkOjpmb3J3YXJkPFQxPihwMSksIHN0ZDo6Zm9yd2FyZDxUUj4ocmVzdCkuLi4gKTsKfQoKaW50IG1haW4oKQp7CiAgICBleHRlbmRfZXhjZXB0aW9uKCBzdGQ6OmNvdXQsIHN0ZDo6c3RyaW5nKCAiSGFwcHkiICkgKTsKICAgIHN0ZDo6c3RyaW5nIHZhciggInZhciIgKTsKICAgIGV4dGVuZF9leGNlcHRpb24oIHN0ZDo6Y291dCwgdmFyICk7CiAgICBleHRlbmRfZXhjZXB0aW9uKCBzdGQ6OmNvdXQsIHZhciwgc3RkOjpzdHJpbmcoICJDb21ibyIgKSwgIGNvbnN0X2Nhc3Q8c3RkOjpzdHJpbmcgY29uc3QmPih2YXIpKTsKICAgIHJldHVybiAwOwp9