C++ 默认枚举值用法

标签 c++ enums default-value

这个讨论是关于默认值的名称: C#: Should the default value of an enum be None or Unknown?

但是,最近与我交谈过的很多人都认为默认枚举值有害、不必要并且可能导致不良做法。

例如考虑以下内容:

enum eJobStates
{
    JOB_STATE_INITIALISING,
    JOB_STATE_PROCESSING,
    JOB_STATE_DONE
};

将作业写成 JOB_STATE_UNKNOWN 是没有意义的,但您可以想象任何可用于监视所述作业的结构都可以使用这样的值。

在定义枚举时是否有关于创建默认值的最佳实践/经验法则?是否应尽可能避免使用它们?

最佳答案

无效的默认值基本上是您设计中的一个变体。该对象在创建时无效。当它合理时,您应该避免这种情况。绝不应该“不惜一切代价”避免它。

有些问题要求您从变体状态开始。在这种情况下,您必须在心理上推理该无效值。如果你避免命名它,你就是在积极地降低你的代码的表现力。考虑一下您与稍后必须维护代码的人之间的沟通。

顺风处理它很烦人。您从变体状态开始,但到它相关时您希望它不再是变体。我更喜欢的策略是允许用户忽略变体状态并在我犯错时抛出。

namespace FooType {
  enum EnumValue {
    INVALID = 0
    ,valid
  };
}

struct Foo {
  Foo() : val(FooType::INVALID) {}
  FooType::EnumValue get() const {
    if (val == FooType::INVALID)
      throw std::logic_error("variant Foo state");
    return val;
  }
  FooType::EnumValue val;
};

这使您的用户不必对差异进行推理,这是值得为之奋斗的。

如果你不能摆脱它,我通常更愿意降级为安全和不安全的接口(interface)。

struct Foo {
  Foo() : val(FooType::INVALID) {}
  bool get(FooType::EnumValue& val_) const {
    if (val == FooType::INVALID)
      return false;
    val_ = val;
    return true;
  }
  FooType::EnumValue get() const {
    FooType::EnumValue val_;
    if (!get(val_))
      throw std::logic_error("variant Foo state");
    return val_;
  }
  FooType::EnumValue get_or_default(FooType::EnumValue def) const {
    FooType::EnumValue val_;
    if (!get(val_))
      return def;
    return val_;
  }
  FooType::EnumValue val;
};

这些类型的接口(interface)适用于数据库之类的东西,其中可能需要空值。

关于C++ 默认枚举值用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13921662/

相关文章:

c++ - 我可以在 C++11 中使用键和值都是枚举类的 std::map 吗?

c# - 为什么 [Enum].Parse 有一个 ignoreCase 参数?

c# - 在 null 时设置属性的默认值

r - R 函数的多个相似输入 - 使用列表提供它们的问题

c# - 哪一个在构建构建器时更有效?

c++ - 在模板类中使用 'new' 是类型安全的吗?

python - cython 问题 : 'bool' is not a type identifier

java - 弄清楚在哪里放置 equalsIgnoreCase() 以避免区分大小写

c++ - 无法添加插槽并将其连接到按钮

c++ - 在 C++ 中,要确保单例线程安全,该怎么做?