加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读