首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C++98中实现作用域枚举,如何在C++11中像枚举类一样使用?

如何在C++98中实现作用域枚举,如何在C++11中像枚举类一样使用?
EN

Stack Overflow用户
提问于 2020-04-17 10:35:21
回答 2查看 473关注 0票数 2

在C++11中,我们已经限定了枚举的作用域,我们可以如下所示使用它。

代码语言:javascript
复制
#include <iostream>
enum class Color
{
    RED,
    BLUE,
};
int main()
{
    Color color = Color::RED;
    if (color == Color::RED)
    {
        std::cout << "red" << std::endl;
    }
    return 0;
}

在我的项目中,我已经在任何地方使用了作用域枚举。

现在我必须迁移到C++98,这样范围内的枚举就不能再使用了。

如何在C++98中实现作用域枚举,并使用与C++11?中相同的枚举

如果实现技术是编译的,我们能把它提取成模板吗?

下面的链接已经谈到了一些技术,但没有C++11那么简单。

How to use enums in C++

例如:

代码语言:javascript
复制
namespace Color
{
enum MyColor
{
    RED,
    BLUE,
};
}

耽误您时间,实在对不起。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-17 10:40:09

在C++11之前,模拟作用域枚举的一种常见方法是在类声明中声明非作用域枚举:

代码语言:javascript
复制
#include <iostream>

struct Color {
   enum MyColor {
      kRed,
      kBlue
   };
};

int main() {
    const Color::MyColor color = Color::kRed;
    if (color == Color::kRed)
    {
        std::cout << "red" << std::endl;
    }
}

或者,作为一个小的变化,为了简洁起见,可能会造成一些混乱(例如,在使用站点:“MyColorColor是如何关联的?”):

代码语言:javascript
复制
#include <iostream>

struct Color {
   enum MyColorImpl {
      kRed,
      kBlue
   };
};

typedef Color::MyColorImpl MyColor;

int main() {
    const MyColor color = Color::kRed;
    if (color == Color::kRed)
    {
        std::cout << "red" << std::endl;
    }
}

当然,您也可以使用问题中所示的名称空间作用域方法,但是它伴随着潜在的问题--名称空间可能扩展到代码库的其他地方,这反过来可能导致意外的(开发人员期望)行为;您模拟的作用域-enum可以开始作为几个不同的非作用域枚举的连接。

代码语言:javascript
复制
#include <iostream>

namespace color {

enum MyColor {
   kRed,
   kBlue
};

}

namespace color {

enum CarColor {
   kAbsolutelyNotRed
};

}

int main() {
    const color::MyColor color = color::kRed;
    // At best, a -Wenum-compare warning.
    if (color == color::kAbsolutelyNotRed)
    {
        // At worst, a critical logical fault.
        std::cout << "absolutely not red (ups, actually red)" << std::endl;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2020-04-18 09:32:16

由于drfi已经给出了一个详细的解释,我在这里仍然给出了另一个解决问题的视角。

我们可以使用类来实现枚举,并支持严格的类型检查。

代码是从书中的class Month示例Effective C++ 3rd: Item 18中修改的。

代码语言:javascript
复制
#include <iostream>
class Color
{
public:
    static Color RED()
    {
        return Color(0);
    }
    static Color BLUE()
    {
        return Color(1);
    }
    bool operator==(const Color &rhs) const
    {
        return this->value == rhs.value;
    }
    bool operator!=(const Color &rhs) const
    {
        return !(*this == rhs);
    }

private:
    explicit Color(int value_) : value(value_) {}
    int value;
};

int main()
{
    Color color = Color::RED();
    if (color == Color::RED())
    {
        std::cout << "red" << std::endl;
    }
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61269537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档