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