在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那么简单。
例如:
namespace Color
{
enum MyColor
{
RED,
BLUE,
};
}耽误您时间,实在对不起。
发布于 2020-04-17 10:40:09
在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;
}
}或者,作为一个小的变化,为了简洁起见,可能会造成一些混乱(例如,在使用站点:“MyColor和Color是如何关联的?”):
#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可以开始作为几个不同的非作用域枚举的连接。
#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;
}
}发布于 2020-04-18 09:32:16
由于drfi已经给出了一个详细的解释,我在这里仍然给出了另一个解决问题的视角。
我们可以使用类来实现枚举,并支持严格的类型检查。
代码是从书中的class Month示例Effective C++ 3rd: Item 18中修改的。
#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;
}https://stackoverflow.com/questions/61269537
复制相似问题