gpt4 book ai didi

c++ - 如何在C++ 98中实现作用域枚举,并且可以像C++ 11中的enum类一样使用?

转载 作者:行者123 更新时间:2023-12-02 10:03:47 26 4
gpt4 key购买 nike

在C++ 11中,我们定义了枚举的作用域,我们可以如下使用它。

#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++

例如:
namespace Color
{
enum MyColor
{
RED,
BLUE,
};
}

谢谢你的时间。

最佳答案

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

#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有什么关系?”):
#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;
}
}

当然,您也可以使用问题中显示的 namespace 作用域确定方法,但随之而来的潜在问题是, namespace 可能会扩展到代码库中的其他位置,进而可能导致意外的(开发人员期望)行为;您的模拟范围枚举可以例如开始表现为几个不同的非作用域枚举的串联。
#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;
}
}

关于c++ - 如何在C++ 98中实现作用域枚举,并且可以像C++ 11中的enum类一样使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61269537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com