同样声明两种不同的类型

时间:2010-11-25 09:15:18

标签: c++ metaprogramming

我希望能够做到这一点:

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

我希望type_0和type_1是两种不同的类型。我该怎么办?

4 个答案:

答案 0 :(得分:7)

template < typename T, int I > class X; 

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

x0和x1将是不同的类型,如果它们不在文件的同一行,则会像这样的任何其他声明。

答案 1 :(得分:1)

您可以使用序数标签:

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

但是这会遇到一些困难,例如需要使用混合赋值语义和继承来转发构造函数参数和危险。

答案 2 :(得分:1)

你需要对另一件事进行参数化(例如整数?)。例如,将X定义为template <typename T, int N> struct X {...};并使用X<int,0> type_0; X<int,1> type_1。如果模板参数匹配,则它们是相同的类型。

答案 3 :(得分:1)

创建一个继承自X模板类的类,如下所示:

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

typedef type_i<0> type_0;
typedef type_i<1> type_1;