我想编写一个简单的错误结构,其中包含某种错误代码和一个 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/