#include <iostream>
#include <type_traits>
template<class OutType>
struct A
{
template<typename T = OutType, typename... Args>
typename std::enable_if<std::is_same<T, void>::value>::type
operator()(Args && ... args)
{
std::cout << "void (args)" << std::endl;
}
template<typename T = OutType>
typename std::enable_if<std::is_same<T, void>::value>::type
operator()()
{
std::cout << "void (void)" << std::endl;
}
template<typename T = OutType, typename... Args>
typename std::enable_if<!std::is_same<T, void>::value, OutType>::type
operator()(Args && ... args)
{
std::cout << "!void (args)" << std::endl;
return OutType();
}
template<typename T = OutType>
typename std::enable_if<!std::is_same<T, void>::value, OutType>::type
operator()()
{
std::cout << "!void (void)" << std::endl;
return OutType();
}
};
int main()
{
A<int> a1;
a1(56, 'e');
a1();
A<void> a2;
a2(13, 0.66f);
a2();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZTxjbGFzcyBPdXRUeXBlPgpzdHJ1Y3QgQQp7CgoJdGVtcGxhdGU8dHlwZW5hbWUgVCA9IE91dFR5cGUsIHR5cGVuYW1lLi4uIEFyZ3M+Cgl0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VCwgdm9pZD46OnZhbHVlPjo6dHlwZQogICAgb3BlcmF0b3IoKShBcmdzICYmIC4uLiBhcmdzKQogICAgewogICAgCXN0ZDo6Y291dCA8PCAidm9pZCAoYXJncykiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIAogICAgdGVtcGxhdGU8dHlwZW5hbWUgVCA9IE91dFR5cGU+Cgl0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VCwgdm9pZD46OnZhbHVlPjo6dHlwZQogICAgb3BlcmF0b3IoKSgpCiAgICB7CiAgICAJc3RkOjpjb3V0IDw8ICJ2b2lkICh2b2lkKSIgPDwgc3RkOjplbmRsOwogICAgfQogICAgCgl0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gT3V0VHlwZSwgdHlwZW5hbWUuLi4gQXJncz4KCXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX3NhbWU8VCwgdm9pZD46OnZhbHVlLCBPdXRUeXBlPjo6dHlwZQogICAgb3BlcmF0b3IoKShBcmdzICYmIC4uLiBhcmdzKSAKICAgIHsKICAgIAlzdGQ6OmNvdXQgPDwgIiF2b2lkIChhcmdzKSIgPDwgc3RkOjplbmRsOwogICAgCXJldHVybiBPdXRUeXBlKCk7CiAgICB9CiAgICAKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQgPSBPdXRUeXBlPgogICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxULCB2b2lkPjo6dmFsdWUsIE91dFR5cGU+Ojp0eXBlCiAgICBvcGVyYXRvcigpKCkKICAgIHsKICAgIAlzdGQ6OmNvdXQgPDwgIiF2b2lkICh2b2lkKSIgPDwgc3RkOjplbmRsOwogICAgCXJldHVybiBPdXRUeXBlKCk7CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIEE8aW50PiBhMTsKICAgIAogICAgYTEoNTYsICdlJyk7CiAgICBhMSgpOwogICAgCiAgICBBPHZvaWQ+IGEyOwogICAgCiAgICBhMigxMywgMC42NmYpOwogICAgYTIoKTsKCiAgICByZXR1cm4gMDsKfQ==