#include <iostream>
#include <string>
struct EmptyType { };
template<class arg1=EmptyType, class arg2=EmptyType, class arg3=EmptyType>
class my_class
{
// FILL_MY_CLASS_DEFINE(3)
};
template<class arg1, class arg2>
class my_class<arg1,arg2,EmptyType>
{
// FILL_MY_CLASS_DEFINE(2)
};
template<class arg1>
class my_class<arg1,EmptyType,EmptyType>
{
// FILL_MY_CLASS_DEFINE(1)
};
template<>
class my_class<EmptyType,EmptyType,EmptyType>
{
// FILL_MY_CLASS_DEFINE(0)
};
int main(int argc, const char *argv[])
{
my_class<std::string, double, int> a;
my_class<std::string, int> b;
my_class<void> c;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKc3RydWN0IEVtcHR5VHlwZSB7ICB9OwoKdGVtcGxhdGU8Y2xhc3MgIGFyZzE9RW1wdHlUeXBlLCBjbGFzcyBhcmcyPUVtcHR5VHlwZSwgY2xhc3MgYXJnMz1FbXB0eVR5cGU+CmNsYXNzIG15X2NsYXNzCnsKICAgIC8vIEZJTExfTVlfQ0xBU1NfREVGSU5FKDMpCn07CnRlbXBsYXRlPGNsYXNzICBhcmcxLCBjbGFzcyBhcmcyPgpjbGFzcyBteV9jbGFzczxhcmcxLGFyZzIsRW1wdHlUeXBlPgp7CiAgICAvLyBGSUxMX01ZX0NMQVNTX0RFRklORSgyKQp9Owp0ZW1wbGF0ZTxjbGFzcyAgYXJnMT4KY2xhc3MgbXlfY2xhc3M8YXJnMSxFbXB0eVR5cGUsRW1wdHlUeXBlPgp7CiAgICAvLyBGSUxMX01ZX0NMQVNTX0RFRklORSgxKQp9Owp0ZW1wbGF0ZTw+CmNsYXNzIG15X2NsYXNzPEVtcHR5VHlwZSxFbXB0eVR5cGUsRW1wdHlUeXBlPgp7CiAgICAvLyBGSUxMX01ZX0NMQVNTX0RFRklORSgwKQp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKewogICAgbXlfY2xhc3M8c3RkOjpzdHJpbmcsIGRvdWJsZSwgaW50PiBhOwogICAgbXlfY2xhc3M8c3RkOjpzdHJpbmcsIGludD4gYjsKICAgIG15X2NsYXNzPHZvaWQ+IGM7CgogICAgcmV0dXJuIDA7Cn0K