我正在为图书馆创建一个多级枚举。
Book::Category::PROGRAMMING::C_PLUS_PLUS
其中Book
是 astruct
并且Category
是(当前) an enum class
。
基本上,我想嵌套 enums。
我知道我可以这样做:
Book::Category::PROGRAMMING_C_PLUS_PLUS
但这不仅会在 中创建一长串值Category
,而且会使维护它成为一场噩梦(我试图用 30 来做到这一点,这已经很头疼了)。
我想分而治之。
编辑 1:我不希望它成为 a 的原因std::string
是它的价值可以是任何东西。我想限制Category
.
不,PROGRAMMING
它不是我图书馆的主要部分。让我尝试使用类和继承。
基本上,我想要enum
s的原因是有一组固定的有效常量。
参考:
Book
,因此它不能是命名空间。我无法理解使用模板的答案。你可以这样做,但这将是一个糟糕的设计。
一种常见的代码味道是使用enum
for what 显然应该是一个类——这里的情况是你希望一个C_PLUS_PLUS
流派是该PROGRAMMING
类别的派生。
但是,enum
s 最好用于描述可能的状态,并且不能按设计继承,正如您在其中一篇参考文献中所指出的。在我看来,最好的行动方针是使在两个独立的成员变量Category
是可以保存的值,如PROGRAMMING
和C_PLUS_PLUS
,并废除其作为状态enum
秒。
想一想:什么最能封装一个开放式领域,例如书籍类型/子类型?你打算编写的每一个可能有enum
?或者只使用两个string
s,(例如genre
和subgenre
)更适合这样的开放式领域?
或者,也许,如果你是专门工作与PROGRAMMING
书为主要部分的设计,转PROGRAMMING
成类,使C_PLUS_PLUS
的部分enum
内是一流的。但是不要同时拥有它们enums
- 这只是在提出问题,并不能解决您已经描述的维护问题。
编辑:从我发表的评论中添加 -
通过强迫它们固定不变,无论如何你都会强迫自己陷入“头痛”的境地。您正在强迫自己维护一个可能在某些时候发生变化的有效枚举的常量列表,此时您将不得不更新您的枚举列表并重新编译您的代码。这里的一个可延展的解决方案是允许它们是字符串,并在启动时读取 .txt 文件或其他内容,并将其作为可接受值的列表,如果您需要验证,您可以检查这些值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句