我想写一个像这样的c ++函数:
#include <system_error>
std::errc f() { return std::errc::success; }
但我无法理解如何使用std :: errc'enum class'type返回成功的值(在本例中为0).我看到的一种方法是返回int:
template <typename E>
constexpr typename std::underlying_type<E>::type to_underlying(E e) {
    return static_cast<typename std::underlying_type<E>::type>(e);
}
int f() { is_succ() ? 0 : to_underlying(err); }
但它对我来说看起来很难看.是从标准c ++ 0x14中的函数返回面向C的成功/错误代码的标准方法吗?
PS.我正在使用MS VC 2015补丁2.
您通常不会std::errc直接从函数返回值。相反,您返回一个std::error_code. 例如,您的函数将像这样声明:
std::error_code f();
然后将该函数的结果与 std::errc 值进行比较。例如:
std::error_code error = f();
if (error == std::errc::no_such_file_or_directory)
{
  // deal with the error
}
std::error_code是上下文可转换的 bool。测试函数是否成功的方法是在布尔表达式中使用错误代码。例如:
std::error_code error = f();
if (error)
{
  // the function failed...
}
要从这样的函数返回成功,您需要返回一个默认的已初始化的std::error_code. 例如:
std::error_code f()
{
  // do stuff...
  return std::error_code{}; // success!
}
当您使用C 风格的 API时,这种方法很有效。您的包装器将std::error_code使用 API 返回的整数值和std::error_category定义如何将这些错误转换为std::errc值的自定义来构造对象。
然而,相反的做法是行不通的。如果您正在为 C++ 库编写 C 包装器,那么您必须以 C 方式做事。enum使用您的错误值定义 an并从您的 C 入口点返回这些值。
你可以这样做:
#include <system_error>
std::errc f() { return std::errc(); }
int main()
{
    std::errc x = f();
    if (x == std::errc())
    {
        // success
    }
}
std::errc() (0) 是一个有效的枚举值,即使它没有出现在从 1 开始的枚举器列表中。它代表成功。
为了进行比较,请查看std::to_chars,它返回一个
struct to_chars_result {
    char* ptr;
    std::errc ec;
}
| 归档时间: | 
 | 
| 查看次数: | 1590 次 | 
| 最近记录: |