Одинаковая декларация двух разных типов - PullRequest
0 голосов
/ 25 ноября 2010

Я хотел бы иметь возможность сделать это:

X<int> type_0;
X<int> type_1; 

, и я хотел бы, чтобы type_0 и type_1 были двух разных типов.Как я могу это сделать?

Ответы [ 4 ]

7 голосов
/ 25 ноября 2010
template < typename T, int I > class X; 

X<int, __LINE__ > x0; 
X<int, __LINE__ > x1;

x0 и x1 будут разными типами, как и любые другие объявления, подобные этому, если они не находятся на одной строке в файле.

1 голос
/ 25 ноября 2010

Вам нужно будет параметризировать другую вещь (например, целое число?).Например, определите X как template <typename T, int N> struct X {...}; и используйте X<int,0> type_0; X<int,1> type_1.Если параметры шаблона совпадают, они одного типа.

1 голос
/ 25 ноября 2010

Создайте класс, который наследуется от класса шаблона X, например:

template <int I>
class type_i : public X<int>
   {
   };

typedef type_i<0> type_0;
typedef type_i<1> type_1;
1 голос
/ 25 ноября 2010

Вы можете использовать порядковые теги:

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> { ... };

Но это страдает от некоторых трудностей, таких как необходимость пересылки параметров конструктора и опасностей с семантикой назначения смешивания и наследования.

...