c – 确保覆盖地图中的所有枚举值
发布时间:2020-12-16 07:10:13 所属栏目:百科 来源:网络整理
导读:说我有以下内容: #include mapenum class Thing {Zero,One,Two};class Metadata {};std::mapThing,Metadata extra_info;void foo() { extra_info[Thing::Zero] = Metadata(); extra_info[Thing::One] = Metadata(); extra_info[Thing::Two] = Metadata();}
说我有以下内容:
#include <map> enum class Thing {Zero,One,Two}; class Metadata {}; std::map<Thing,Metadata> extra_info; void foo() { extra_info[Thing::Zero] = Metadata(); extra_info[Thing::One] = Metadata(); extra_info[Thing::Two] = Metadata(); } 我想确保在添加新标签的情况下,在extra_info中考虑Thing的所有标签,例如Thing :: Three. 我认为最后总是有一个标签,LastTag,并从0迭代到LastTag – 2并验证这些键是否存在于地图中,但这看起来很糟糕.在编译时实现这一点的方法是最好的,但我可以看到这根本不可能. 在C#中,使用反射获取所有枚举值,然后迭代这些值是一件简单的事情.我认为它告诉我无法用C标签找到答案,但我可以找到Java和C#的答案……这让我觉得这是不可能的. 解决方法
枚举中的Sentinel值已成为许多项目的一部分,用于指示枚举值的数量或从系统定义的枚举用户可用枚举的范围.
在您的情况下,您可以利用地图具有唯一键并添加标记值(严格地说不是枚举的一部分)的事实: enum class Thing { Zero,Two,Three,EndSentinel }; class Metadata {}; std::map<Thing,Metadata> extra_info; typedef std::map<Thing,Metadata>::size_type map_type; void foo() { // Can't forget these values extra_info[Thing::Zero] = Metadata(); extra_info[Thing::One] = Metadata(); extra_info[Thing::Two] = Metadata(); extra_info[Thing::Three] = Metadata(); } int main() { foo(); assert(extra_info.size() == (map_type)Thing::EndSentinel); } Example (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |