我想用标准C++中的等价物尽可能多地替换外部库(如boost),如果它们存在并且可以的话,以最小化依赖性,因此我想知道是否存在一种安全的方法将boost::system::error_code
转换为std::error_code
。伪代码示例:
void func(const std::error_code & err)
{
if(err) {
//error
} else {
//success
}
}
boost::system::error_code boost_err = foo(); //foo() returns a boost::system::error_code
std::error_code std_err = magic_code_here; //convert boost_err to std::error_code here
func(std_err);
最重要的是它不是完全相同的错误,只是尽可能地接近,最后如果是一个错误或没有。有什么聪明的解决办法吗?
先谢了!
4条答案
按热度按时间euoag5mw1#
我有这个完全相同的问题,因为我想使用
std::error_code
,但也使用其他boost库使用boost::system::error_code
(例如boost ASIO).公认的答案适用于std::generic_category()
处理的错误代码,因为它们是从boost的一般错误代码简单转换而来的,但它不适用于您想要处理自定义错误类别的一般情况.因此我创建了以下代码作为通用的
boost::system::error_code
到std::error_code
转换器。它通过为每个boost::system::error_category
动态创建一个std::error_category
shim来工作,将调用转发到底层Boost错误类别。由于错误类别需要是单例(或至少像本例中一样是单例),我不希望有太多的内存爆炸。我也只是将
boost::system::generic_category()
对象转换为使用std::generic_category()
,因为它们的行为应该是相同的。我本来想对system_category()
做同样的事情,但是在VC++10上测试时,它打印出了错误的消息(我假设它应该打印出你从FormatMessage
得到的消息,但是它似乎使用了strerror
,Boost使用了FormatMessage
,正如预期的那样)。要使用它,只需调用
BoostToErrorCode()
,定义如下。只是一个警告,我今天才写这个,所以它只有基本的测试。你可以使用它的任何方式你喜欢,但你这样做是在你自己的风险。
lf5gs5x22#
从C++-11(std::errc)开始,boost/system/error_code.hpp将相同的错误代码Map到std::errc,std::errc在系统头文件
system_error
中定义。您可以比较这两个枚举,它们在功能上应该是等效的,因为它们看起来都是基于POSIX标准的。可能需要强制转换。
例如,
和
std::errc
ctehm74n3#
我把上面的解决方案修改成一个更短的解决方案,使用thread_local std::map在类别名称和示例之间进行Map,这样就不需要锁了。
限制是不能在线程之间传递错误代码,因为类别指针是不同的。(如果不想使用thread_local存储,将其转换为锁定函数非常简单)
而且我喂它更紧凑。
9lowa7mx4#
从Boost版本1.65开始,你可以将boost::error_code转换成C11中的对应代码:
在C11编译器上,Boost.System现在提供从boost::system::error_category,error_code和error_condition到它们的标准等价形式的隐式转换<system_error>。
这允许库公开C++11接口并通过std::error_code报告错误,即使在使用Boost.System时,也可以直接或通过依赖项(如Boost.ASIO)报告错误。
因此,现在应该是这样简单: