Вы можете использовать порядковые теги:
template <typename T, int Tag> class X { ... };
typedef X<int, 0> type_0;
typedef X<int, 1> type_1;
В качестве альтернативы, вы можете использовать наследование:
class type_0 : X<int> { ... };
class type_1 : X<int> { ... };
Но это страдает от некоторых трудностей, таких как необходимость пересылки параметров конструктора и опасностей с семантикой назначения смешивания и наследования.