#include <iostream>
#include <memory>
#include <tuple>
struct Dynamic
{
virtual ~Dynamic( ) { }
} ;
template < typename A, typename B>
struct Generic : Dynamic
{
Generic( )
{
std:: cout << __PRETTY_FUNCTION__ << std:: endl ;
}
} ;
template < typename A, typename B>
std:: unique_ptr < Dynamic> Make( )
{
return std:: unique_ptr < Dynamic> ( new Generic< A, B> ( ) ) ;
}
template < typename A>
std:: unique_ptr < Dynamic> Make( char b)
{
switch ( b)
{
case 'i' :
{
return Make< A, int > ( ) ;
}
case 'u' :
{
return Make< A, unsigned > ( ) ;
}
default : throw 0 ;
}
}
std:: unique_ptr < Dynamic> Make( char a, char b)
{
switch ( a)
{
case 'i' :
{
return Make< int > ( b) ;
}
case 'u' :
{
return Make< unsigned > ( b) ;
}
default : throw 0 ;
}
}
int main( )
{
Make( 'i' , 'i' ) ;
Make( 'i' , 'u' ) ;
Make( 'u' , 'i' ) ;
Make( 'i' , 'i' ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dHVwbGU+CgoKc3RydWN0IER5bmFtaWMKewogICAgdmlydHVhbCB+RHluYW1pYygpIHt9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgpzdHJ1Y3QgR2VuZXJpYyA6IER5bmFtaWMKewogICAgR2VuZXJpYygpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IF9fUFJFVFRZX0ZVTkNUSU9OX18gPDwgc3RkOjplbmRsOwogICAgfQp9OwoKCnRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CnN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljPiBNYWtlKCkKewogICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljPihuZXcgR2VuZXJpYzxBLCBCPigpKTsKfQoKCnRlbXBsYXRlPHR5cGVuYW1lIEE+CnN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljPiBNYWtlKGNoYXIgYikKewogICAgc3dpdGNoIChiKQogICAgewogICAgICAgIGNhc2UgJ2knOgogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIE1ha2U8QSwgaW50PigpOwogICAgICAgIH0KICAgICAgICBjYXNlICd1JzoKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBNYWtlPEEsIHVuc2lnbmVkPigpOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OiB0aHJvdyAwOwogICAgfQp9CgoKc3RkOjp1bmlxdWVfcHRyPER5bmFtaWM+IE1ha2UoY2hhciBhLCBjaGFyIGIpCnsKICAgIHN3aXRjaCAoYSkKICAgIHsKICAgICAgICBjYXNlICdpJzoKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBNYWtlPGludD4oYik7CiAgICAgICAgfQogICAgICAgIGNhc2UgJ3UnOgogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIE1ha2U8dW5zaWduZWQ+KGIpOwogICAgICAgIH0KICAgICAgICBkZWZhdWx0OiB0aHJvdyAwOwogICAgfQp9CgoKaW50IG1haW4oKQp7CiAgICBNYWtlKCdpJywgJ2knKTsKICAgIE1ha2UoJ2knLCAndScpOwogICAgTWFrZSgndScsICdpJyk7CiAgICBNYWtlKCdpJywgJ2knKTsKfQ==
stdout
Generic<A, B>::Generic() [with A = int, B = int]
Generic<A, B>::Generic() [with A = int, B = unsigned int]
Generic<A, B>::Generic() [with A = unsigned int, B = int]
Generic<A, B>::Generic() [with A = int, B = int]