【问题标题】:Semi-private enum values半私有枚举值
【发布时间】:2022-08-18 23:18:44
【问题描述】:

是否可以进行枚举,其中(某些)成员可以从用户代码访问,而其他成员则保留用于实现?

这是我试图处理的情况的一个缩小示例:我有一个基准测试框架,我在其中检测用户提供的功能。为了检查执行的健全性,用户应该报告执行是否正确,因此创建了一个return_code 枚举:

enum return_code {
  ok,
  error,
  execution_timeout,
  waiting_time_exceeded
};

最后两个枚举器不应该对用户可用,即我是负责检查是否有超时或处理队列从未按时执行函数的人。

我目前对这种情况的处理是将枚举器拆分为私有和公共接口:

namespace detail {
  enum return_code_internal {
      ok,
      error,
      execution_timeout,
      waiting_time_exceeded
  };
}

enum return_code {
    ok,
    error
};

所以return_code::ok 映射到detail::return_code_internal::okerror 也是如此,而“内部”枚举数对用户不可见。这可行,但在两种类型之间转换时迫使我跳过箍,因为它们不是对称的(一个有 2 个成员,而另一个有 4 个)。有没有更好的办法?

P.S 我知道在 C++ 中,枚举器具有相同的可见性。我正在寻找一种可以模拟将两个enum 成员作为“公共”,而另外两个是“私人”(或供内部使用)的技术。

  • 使用具有static 成员的类作为枚举?
  • @NathanOliver 这听起来可行。你的意思是我会有公共/私有成员,然后内部实现的类将成为“枚举器类”的朋友,以便能够访问内部,对吗?我会很感激答案中的粗略草图,这样我就不会迷失在细节中

标签: c++ design-patterns enums


【解决方案1】:

您可以使用具有静态成员的类作为枚举。这使您可以拥有公共和私人成员。唯一的问题是您需要为所有需要访问这些私有变量的事物授予友谊。这可能看起来像:

struct return_code
{
    constexpr static int ok = 0;
    constexpr static int error = 1;
private:
    constexpr static int execution_timeout = 2;
    constexpr static int waiting_time_exceeded = 3;
    
    friend xxx;
    friend yyy;
    friend zzz;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2020-02-16
    • 2016-07-17
    • 1970-01-01
    相关资源
    最近更新 更多