gpt4 book ai didi

design-patterns - 您在 C++ 中使用哪种类型安全枚举?

转载 作者:行者123 更新时间:2023-12-03 06:35:37 26 4
gpt4 key购买 nike

众所周知,C++ 中的内置枚举不是类型安全的。我想知道那里使用了哪些实现类型安全枚举的类......我自己使用以下“自行车”,但它有点冗长和有限:

typesafeenum.h:

struct TypesafeEnum
{
// Construction:
public:
TypesafeEnum(): id (next_id++), name("") {}
TypesafeEnum(const std::string& n): id(next_id++), name(n) {}

// Operations:
public:
bool operator == (const TypesafeEnum& right) const;
bool operator != (const TypesafeEnum& right) const;
bool operator < (const TypesafeEnum& right) const;

std::string to_string() const { return name; }

// Implementation:
private:
static int next_id;
int id;
std::string name;
};

typesafeenum.cpp:

int TypesafeEnum::next_id = 1;

bool TypesafeEnum::operator== (const TypesafeEnum& right) const
{ return id == right.id; }

bool TypesafeEnum::operator!= (const TypesafeEnum& right) const
{ return !operator== (right); }

bool TypesafeEnum::operator< (const TypesafeEnum& right) const
{ return id < right.id; }

用法:

class Dialog 
{
...
struct Result: public TypesafeEnum
{
static const Result CANCEL("Cancel");
static const Result OK("Ok");
};


Result doModal();
...
};

const Dialog::Result Dialog::Result::OK;
const Dialog::Result Dialog::Result::CANCEL;

添加:我认为我应该更具体地说明要求。我将尝试总结它们:

优先级 1:将枚举变量设置为无效值应该是不可能的(编译时错误),没有异常(exception)。

优先级 2:通过单个显式函数/方法调用应该可以将枚举值转换为 int 或从 int 转换。

优先级3:尽可能紧凑、优雅、方便的声明和使用

优先级 4:枚举值与字符串之间的转换。

优先级 5:(很高兴拥有)迭代枚举值的可能性。

最佳答案

我目前正在研究 Boost Vault 中的 Boost.Enum 提案(文件名enum_rev4.6.zip)。尽管它从未正式提交纳入 Boost,但它可以按原样使用。 (缺乏文档,但可以通过清晰的源代码和良好的测试来弥补。)

Boost.Enum 允许您像这样声明一个枚举:

BOOST_ENUM_VALUES(Level, const char*,
(Abort)("unrecoverable problem")
(Error)("recoverable problem")
(Alert)("unexpected behavior")
(Info) ("expected behavior")
(Trace)("normal flow of execution")
(Debug)("detailed object state listings")
)

并让它自动扩展为:

class Level : public boost::detail::enum_base<Level, string>
{
public:
enum domain
{
Abort,
Error,
Alert,
Info,
Trace,
Debug,
};

BOOST_STATIC_CONSTANT(index_type, size = 6);

Level() {}
Level(domain index) : boost::detail::enum_base<Level, string>(index) {}

typedef boost::optional<Level> optional;
static optional get_by_name(const char* str)
{
if(strcmp(str, "Abort") == 0) return optional(Abort);
if(strcmp(str, "Error") == 0) return optional(Error);
if(strcmp(str, "Alert") == 0) return optional(Alert);
if(strcmp(str, "Info") == 0) return optional(Info);
if(strcmp(str, "Trace") == 0) return optional(Trace);
if(strcmp(str, "Debug") == 0) return optional(Debug);
return optional();
}

private:
friend class boost::detail::enum_base<Level, string>;
static const char* names(domain index)
{
switch(index)
{
case Abort: return "Abort";
case Error: return "Error";
case Alert: return "Alert";
case Info: return "Info";
case Trace: return "Trace";
case Debug: return "Debug";
default: return NULL;
}
}

typedef boost::optional<value_type> optional_value;
static optional_value values(domain index)
{
switch(index)
{
case Abort: return optional_value("unrecoverable problem");
case Error: return optional_value("recoverable problem");
case Alert: return optional_value("unexpected behavior");
case Info: return optional_value("expected behavior");
case Trace: return optional_value("normal flow of execution");
case Debug: return optional_value("detailed object state listings");
default: return optional_value();
}
}
};

它满足您列出的所有五个优先事项。

关于design-patterns - 您在 C++ 中使用哪种类型安全枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/217549/

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