在下面的示例中,声明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;
}
答案 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;
}