模板结构中的枚举

时间:2019-03-12 09:57:14

标签: c++ templates enums

我的问题和这个人的问题相同:Link

当时不可能,现在也不可能,但是我的实际问题是:

在即将到来的C ++标准(17及更高版本)中是否没有允许它的工作?我几乎100%可以肯定我在 somewhere 这些地方读过一些东西。

我想这是某种包装器,它只是返回用void初始化的模板对象,然后允许这种方式访问​​枚举。

有人可以指出我正确的方向吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

它们是不同的类型,我认为这不会像以往那样改变。

想想如果有一个模板专业化会更改枚举值而不是其“名称”,那么会发生什么。

答案 1 :(得分:2)

请考虑以下代码:

#include <iostream>

template<typename T>
class SomeClass;

template<>
class SomeClass<int>
{
public:
    enum SomeEnum { A=1, B=2 };
};

template<>
class SomeClass<double>
{
public:
    enum SomeEnum { A=4, B=5 };
};


int main()
{
  std::cout << SomeClass<int>::SomeEnum::A << std::endl;
  std::cout << SomeClass<double>::SomeEnum::A << std::endl;
}

(我在http://cpp.sh/7xc3上进行了测试)

输出为1和4。或者,我可以给那些枚举值C和D之一,或者也许B和C。

因此,SomeClass::SomeEnum::A应该是毫无疑问的。现在,这些是整数值,但还要考虑SomeClass<int>::SomeEnum::A != SomeClass<double>::SomeEnum::A

这是为什么您要求的内容无法正常工作的解释。我想您要记住,在一个单一的实现中编写一个模板类,在这种情况下,它不会是模棱两可的。但这只是完成此操作的常用方法,而不是技术含义。毕竟,SomeClass<int>SomeClass<double>完全是一个不同的类。在机器上,它们是两个完全独立的类,例如SomeClassIntSomeClassDouble,如上所述,它们可以具有完全不同的实现。

此外,即使您通常陈述一个实现,另一个人以后仍然可以编写专门的实现,这将完全与您的代码一起使用而无需重写它。因此,现有的单个实现并不意味着它将在未来保持明确。那将是一个主要问题。

也就是说,您链接中问题的答案提供了使用通用基类解决问题的好方法。您有没有理由不使用它吗?

无论如何,请在OOP的有机思维过程中反思一下枚举的含义。您有需要的示例吗?让我们谈谈这个问题,可能是一个XY问题。