Typedef和模板特化

时间:2010-08-05 16:28:07

标签: c++ templates typedef type-systems template-specialization

考虑以下代码:

typedef int type1;
typedef int type2;

template <typename>
struct some_trait;

template <>
struct some_trait<type1>
{
    static const int something=1;
};

template <>
struct some_trait<type2>
{
    static const int something=2;
};

它失败了,因为编译器看到的是some_trait<int>的两个特化。

最好的解决方法是什么?

7 个答案:

答案 0 :(得分:7)

我认为能够专注于名称type1type2,您必须使它们实际上是不同类型而不是相同类型的别名:

struct type1 {
     int data;
};

struct type2 {
    int data;
};

// ...

但如果你更多地了解你的最终目标,可能会有不同的/更好的方法来完成你正在寻找的目标。

答案 1 :(得分:3)

最好的方法是什么?

两个类型名称都指向相同的int类型。由于此处只有一个类型,因此您只需要一个特征。因此,“解决这个问题的最佳方法”是删除第二个专业并忘掉它。完成。

这就是你想要的吗?如果没有,请提供更有意义的描述,说明您要实现的目标。

答案 2 :(得分:3)

如果您指的是显式专业化

,您可以拥有类似的内容
enum TypeOne;
enum TypeTwo;

template <typename>
class AClass;

template <>
class AClass<TypeOne>{
 public:
  int something;
};

template <>
class AClass<TypeTwo>{
 public:
  char something;
};

AClass<TypeOne> obj1;
AClass<TypeTwo> obj2;

我也从 boost库中看到了可以做你想要的东西,为不同的类型输入相同的类型以进行显式特化,但我不记得它究竟是什么。

答案 3 :(得分:2)

听起来像下面的内容可能是你所追求的:

template <int arg>
class AClass
{
    static const int something=arg;
};

将被实例化为:

AClass<1> obj1;
AClass<2> obj2;

答案 4 :(得分:2)

该代码失败,因为编译器看到 发生 两次 相同的 专业化。

您的问题是typedef,尽管名称如此, 定义新类型。它只为另一种类型生成 别名 type1type2以及int实际上只是同一类型的不同名称。

最好的方法取决于你想要达到的目标。如果你绝对需要这种专业化,你将不得不提出两种不同的类型。但是,可能有更好的方法来做到这一点。

答案 5 :(得分:0)

我不知道你在这里想做什么。最后,两者都是 some_trait< int > 尝试围绕单个int制作结构?

答案 6 :(得分:0)

我认为你想要实现这样的目标:template <typename T, T t> struct typify{ static const T something = t;};你的2个专业将被写成struct int_1 : typify<int, 1>{};和......