【问题标题】:Good style - return enum or int? [closed]好风格 - 返回枚举或整数? [关闭]
【发布时间】:2013-07-16 14:14:47
【问题描述】:

如果我有一个定义枚举的类,应该将返回该枚举的成员函数声明为返回该枚举,还是返回一个 int?

例如:

class Foo {

  public:

    enum Stooge { larry, moe, curly};

    Stooge WhoToPoke();
    // OR: int WhoToPoke(); ???

}

我一直在声明这样的方法作为返回枚举,但不知道如果我将它声明为 int,它是“更好的样式”还是对客户更有用。

【问题讨论】:

  • 我会选择枚举。不过,我认为这个问题不适合Stack Overflow
  • 不应将返回 X 的成员函数声明为返回 Y。例外是泛化,如指向基类的指针。
  • 标准库中的所有类都用于枚举,例如 ios::out。不能打败它。
  • 我还建议查看 @ )Type Safe Enum Idiom - 我将它与静态 boost bimap 一起用于序列化/反序列化

标签: c++ coding-style enums


【解决方案1】:

enum 为调用者提供了某种类型安全性...例如,当需要 Foo::Stooge 时,它们不能将 int 作为参数传递,或者使用 (uncast) 初始化 Foo::Stooge ) int 或其他类型的 enum

BobTFish 的评论正确地指出,仍然有很多讨厌的代码可以编译 - 比我记得的要多,因为我不会尝试编写糟糕的代码来继续探索编译器检查的边缘! C++11 针对 enum classes 对此进行了改进。

此外,如果您添加一个 std::ostream& operator<<(std::ostream&, Stooge) 函数,那么他们可以流式传输该值 - 实现可以保证一个符号名称(即他们实际上会在流中看到“larry”、“moe”或“curly” )。

【讨论】:

  • enum 为调用者提供类型安全......”不是真的。这就是我们现在拥有enum class 的原因。见ideone.com/q7d83T
  • @BoBTFish 我无法理解您的链接,您是什么意思?
  • @BoBTFish:作用域枚举确实提供了更强的类型安全性;但正如答案所描述的,无范围枚举仍然提供一些类型安全(与整数类型相比)。
  • 我的示例表明,你们都可以将它与其他不相关的值进行比较,并且可以在需要int时传递它。
  • 所以换句话说,枚举并不能提供完美的类型安全性(隐式转换为 int 仍然会发生),但提供了一些安全性(例如,不允许比较不同的枚举)。由于您要传达此类型,因此不应使用 int 返回值。
猜你喜欢
  • 2012-10-30
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多