使用模板化c ++类中定义的类型声明

时间:2016-02-21 00:11:44

标签: c++ templates typedef

在下面的示例中,声明coord变量的正确方法是什么?模板参数占位符将起作用,例如:

MyClass<int>::Coord coord;

考虑到Coord完全不知道模板参数,这肯定是丑陋的。理想情况下,是否有一些语法允许我在不指定任何模板参数的情况下声明coord

template <typename T>
class MyClass {
 public:
  enum Coord {
    x, y, z,
  };  
};

int main(int argc, char *argv[]) {
  MyClass<???>::Coord coord;
}

3 个答案:

答案 0 :(得分:1)

考虑:

results

我希望通过这个示例向您展示的是,即使template <> class MyClass<std::string> { public: static int Coord = 42; }; 本身不依赖于它,实际指定模板参数也可以产生巨大的差异。因此,如果Coord确实不应该依赖于模板参数(这里似乎就是这种情况),那么它首先不应该是模板类的成员。

答案 1 :(得分:1)

如果您希望在Coord没有模板类型的情况下使用MyClass,请将其(以及所有非模板内容)从MyClass移至非模板库类。您将其用作:

MyBase::Coord coord;

并且您将获得以下等于true

std::is_same<MyClass<void>::Coord, MyClass<int>::Coord>::value

我不知道您希望false成为enum的情况,除非您想将其专门化。

答案 2 :(得分:1)

基本上添加其他人说的话,你应该考虑它是否应该是一个类成员,如果它应该是,你应该考虑将它移动到基类。

话虽如此,您可以创建以下代码,虽然有点费解,但允许您使用

MyClass<>::Coord coord;

首先在detail命名空间中定义一个虚拟类:

namespace detail
{
    struct MyClassVoid{};
};

现在宣布你的班级

template <typename T>
class MyClass;

并给它一个专门化的虚拟类,在其中定义&#34;非模板&#34;东西:

template<>
class MyClass<detail::MyClassVoid>
{
public:
enum Coord {
    x, y, z,
}; 
};

现在定义类的一般形式,派生自专门的:

template <typename T=detail::MyClassVoid>
class MyClass : public MyClass<detail::MyClassVoid> {
    // "Real members" go here.
};

这将构建:

int main(int argc, char *argv[]) {
MyClass<>::Coord coord;
}

完整代码:

namespace detail                                                                                                                            
{
    struct MyClassVoid{};
};

template <typename T>
class MyClass;


template<>
class MyClass<detail::MyClassVoid>
{
public:
enum Coord {
    x, y, z,
}; 
};


template <typename T=detail::MyClassVoid>
class MyClass : public MyClass<detail::MyClassVoid> {
};


int main(int argc, char *argv[]) {
MyClass<>::Coord coord;
}