我的问题和这个人的问题相同:Link
当时不可能,现在也不可能,但是我的实际问题是:
在即将到来的C ++标准(17及更高版本)中是否没有允许它的工作?我几乎100%可以肯定我在 somewhere 这些地方读过一些东西。
我想这是某种包装器,它只是返回用void
初始化的模板对象,然后允许这种方式访问枚举。
有人可以指出我正确的方向吗?
谢谢!
答案 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>
完全是一个不同的类。在机器上,它们是两个完全独立的类,例如SomeClassInt
和SomeClassDouble
,如上所述,它们可以具有完全不同的实现。
此外,即使您通常陈述一个实现,另一个人以后仍然可以编写专门的实现,这将完全与您的代码一起使用而无需重写它。因此,现有的单个实现并不意味着它将在未来保持明确。那将是一个主要问题。
也就是说,您链接中问题的答案提供了使用通用基类解决问题的好方法。您有没有理由不使用它吗?
无论如何,请在OOP的有机思维过程中反思一下枚举的含义。您有需要的示例吗?让我们谈谈这个问题,可能是一个XY问题。