c++ - 如何编写一个错误结构,它可以包含不同的强类型枚举作为错误代码?

标签 c++ error-handling enums c++17

我想编写一个简单的错误结构,其中包含某种错误代码和一个 std::string作为消息。错误代码可以是一个简单的 int,或任何类型的强类型枚举,例如:

enum class NetworkErrorCode {
OK = 0,
CONNECTION_FAILURE,
EMPTY_RESPONSE,
HOST_RESOLUTION_FAILURE,
UNKNOWN_ERROR = 1000,
};

我可以编写一个结构,它为它可能包含的每个不同的枚举都有不同的重载构造函数,所有这些都将它们转换成 int存储它们。但在这种情况下,我将放弃稍后将错误代码与实际枚举值进行比较的可能性。我还需要为每种可能的类型编写一个比较运算符。

我也可以使用这样的模板:

template<typename T>
struct Error
{
  T const code;
  std::string const message;
};

但现在我无法创建这样的错误:

Error{NetworkErrorCode::CONNECTION_FAILURE, "some message"} .

我需要写:

Error<NetworkErrorCode>{NetworkErrorCode::CONNECTION_FAILURE, "some message"} .

有没有一种方法可以避免像第一个解决方案那样编写大量样板代码,同时仍然保持在不明确指定类型名称的情况下创建它们的可能性?我听说过 c++17 中类模板构造函数的模板参数推导,但我无法理解它。

最佳答案

using error_code = std::variant<int, NetworkErrorCode, AnotherErrorCode /*etc*/>;

struct Error {
  error_code code;
  std::string message;
};

这需要您在一处列出所有错误代码类型;但这比编写您想编写的构造函数要少一些工作。

Error{NetworkErrorCode::CONNECTION_FAILURE, "some message"}

无需编写额外的构造函数即可工作,因为 variant 将从其任何可能的类型转换而来。

要获得访问权限,您需要 std::visit.get<Type>()等等。 ==error_code通常应该可以正常工作(有时您可能必须将另一个参数显式地转换为 error_code)。

关于c++ - 如何编写一个错误结构,它可以包含不同的强类型枚举作为错误代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50028408/

相关文章:

不抛出方法的 Swift 错误处理

java - 在这种情况下如何避免 if-else 语句

c++ - 我正在阅读开源代码(C++),但不知道为什么他们这样放置枚举

php - 在Stripe PHP上捕获特定错误以显示自定义消息

python - Choregraphe中的python代码错误

c# - UInt32 的底层枚举类型导致编译器错误

oop - SystemVerilog 中的打包联合

c++ - 检查FlexBuffers缓冲区在C++中是否未损坏

C++ 编译错误,std 中的互斥量未命名 MinGW (GCC 6.3.0) 中的类型

c++ - 在 C++ 中比较 buffer 和 const char*