【问题标题】:C++ Method with an enum class type具有枚举类类型的 C++ 方法
【发布时间】:2019-02-19 09:06:33
【问题描述】:

尝试打印具有 enum 类类型的类方法时出现问题。

我有一个方法,它返回一个被强制转换为 bool 的枚举:

bool Window::IsVSync() const
{
    return static_cast<bool>(m_WindowData.VSync);
}

m_WindowData.VSync 是垂直同步类型。

这就是枚举类:

enum class VSync : bool
{
    Disable = false,
    Enable = true
}

我知道使用 enum 类我没有得到隐式转换,这就是我强制转换为 bool 的原因。就像这样,一切都运行良好。但是考虑到我的枚举类是从 bool 扩展而来的,我可以这样做:

VSync Window::IsVSync() const
{
    return m_WindowData.VSync;
}

起初,我认为我可以,因为我们从 bool 扩展了枚举类,但我错了,当我尝试打印到控制台时它给了我这个错误:

binary '

我将方法打印到控制台:

std::cout << myWindow.IsVSync() << "\n";

当然,应该返回 1 或 0;

当我在输出中将它转换为 bool 时:

std::cout << static_cast<bool>(myWindow.IsVSync()) << "\n";

它工作得很好,但我不想让用户必须将它转换为 bool 才能工作。我需要一个方法本身的解决方案,所以调用保持不变

std::cout << myWindow.IsVSync() << "\n";

【问题讨论】:

  • return either 1 or 0; - 没有从 VSync 到 '1''0' 的转换。写下来。 std::cout &lt;&lt; myWindow.IsVSync() == VSync::Disable ? '0' : '1'.
  • 用户为什么要写这个?我想从方法中做到这一点如果我在输出时转换为 bool 它实际上确实可以正常工作,但是我不想让用户做这样的事情

标签: c++ enums


【解决方案1】:

您可以在类之外为枚举类型定义流运算符重载,如下所示:

static std::ostream& operator<<(std::ostream& os, const VSync& val)
{
    switch (val) {
        case VSync::Disable:
            os << "VSync disabled";
            break;
        case VSync::Enable:
            os << "VSync enabled";
            break;
    }
    return os;
}

通过这种方式,您无需投射任何内容,并且可以打印比10(或必须使用std::boolalpha)更详细的内容。

希望能帮到你。

【讨论】:

  • 非常感谢,完美运行!运算符重载通常放在哪里?我有一堂课,但你说它应该是课外的。它仍然与该类中的枚举相关。
  • @JohnDavis 因为它是一个enum 类,所以您不能在枚举声明中直接使运算符重载.. 但您可以将运算符重载放在枚举类所在的类中.. . 就个人而言,我通常将流运算符重载放在它们所适用的类中,并将该函数标记为朋友,以便它可以在需要时访问私有/受保护成员。
【解决方案2】:

它不是从 bool 扩展而来的,它使用与 bool 相同的空间量。
对于枚举,冒号不表示继承。

【讨论】:

    猜你喜欢
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    相关资源
    最近更新 更多