template< typename T > class my_class {};
template< int N > struct get_type ; // generalization is not defined
struct A { enum { id = 0 }; } ;
template <> struct get_type<0> { typedef A type ; };
struct B { enum { id = 1 }; } ;
template <> struct get_type<1> { typedef B type ; };
// etc ..
int main()
{
int a ;
std::cin >> a ;
switch(a)
{
case 0:
{
my_class< typename get_type<0>::type > my_object ;
// use my_object
}
case 1:
{
my_class< typename get_type<1>::type > my_object ;
// use my_object
}
// etc ...
default:
{
// error; no type matches this id
}
}
}