gpt4 book ai didi

c++ - 确保覆盖 map 中的所有枚举值

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:11 25 4
gpt4 key购买 nike

假设我有以下内容:

#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();
}

如果添加了新标签,如 Thing::三.

我考虑总是在末尾有一个标签,LastTag,然后从 0 迭代到 LastTag - 2 并验证这些键是否存在在 map 上,但这看起来很笨拙。在编译时完成此操作的方法最好,但我认为这根本不可能。

在 C# 中,使用反射获取所有枚举值然后迭代这些值是一件简单的事情。我认为这表明我无法使用 C++ 标记找到此问题的答案,但我可以找到 Java 和 C# 的答案...这让我认为这是不可能的。

最佳答案

枚举中的哨兵值已成为许多项目的一部分,用于指示枚举值的数量或将用户可用枚举与系统定义的枚举的范围分开。

在您的情况下,您可以利用 map 具有唯一键这一事实并添加标记值(严格来说不是枚举的一部分):

enum class Thing { Zero, One, 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

关于c++ - 确保覆盖 map 中的所有枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26768271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com