Boost C++ 库

……是世界上最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ Coding Standards

常见问题 - Boost C++ 函数库
PrevUpHomeNext
  • 问题: 为什么 lexical_cast<int8_t>("127") 会抛出 bad_lexical_cast 异常?
    • 回答: 类型 int8_tcharsigned chartypedef。词法转换到这些类型仅仅是从源读取一个字节,但由于源包含多个字节,因此会抛出异常。请使用其他整数类型,如 intshort int。如果边界检查很重要,您还可以调用 boost::numeric_castnumeric_cast<int8_t>(lexical_cast<int>("127"));

  • 问题: 为什么 lexical_cast<unsigned char>("127") 会抛出 bad_lexical_cast 异常?
    • 回答: 词法转换到任何 char 类型仅仅是从源读取一个字节。但由于源包含多个字节,因此会抛出异常。请使用其他整数类型,如 intshort int。如果边界检查很重要,您还可以调用 boost::numeric_castnumeric_cast<unsigned char>(lexical_cast<int>("127"));

  • 问题: lexical_cast<std::string>int8_tuint8_t 的转换为什么不符合我的预期?
    • 回答: 如上所述,请注意 int8_tuint8_t 实际上是 char,并且以 char 的方式进行格式化。要避免这种情况,请先转换为整数类型:lexical_cast<std::string>(static_cast<int>(n));

  • 问题: 该实现总是重置底层流对象的 ios_base::skipws 标志。这破坏了我仅在存在此标志时才工作的 operator>>。可以移除重置标志的代码吗?

  • 问题: 为什么 std::cout << boost::lexical_cast<unsigned int>("-1"); 不抛出异常,而是输出 4294967295?
    • 回答: boost::lexical_cast 具有 std::stringstream 的行为,它使用 std::localenum_get 函数来转换数字。如果我们查看 "Programming languages — C++",我们会看到 num_get 使用 scanf 的规则进行转换。根据 C99 标准,无符号输入值的减号是可选的,因此如果读取负数,不会出现错误,结果将是二进制补码。

  • 问题: 为什么 boost::lexical_cast<int>(L'A'); 输出 65,而 boost::lexical_cast<wchar_t>(L"65"); 不抛出异常?
    • 回答: 如果您使用的是旧版本的 Visual Studio 或使用 /Zc:wchar_t- 标志编译代码,boost::lexical_cast 会将单个 wchar_t 字符视为 unsigned short。这不是 boost::lexical_cast 的错误,而是您使用的编译器选项的限制。

  • 问题: 为什么 boost::lexical_cast<double>("-1.#IND"); 会抛出 boost::bad_lexical_cast
    • 回答: "-1.#IND" 是一个违反标准的编译器扩展。您应该输入 "-nan""nan""inf""-inf"(不区分大小写)字符串来获取 NaN 和 Inf 值。当 boost::lexical_cast<string> 具有 NaN 或 Inf 输入值时,它会输出 "-nan""nan""inf""-inf" 字符串。

  • 问题: 使用 boost::lexical_cast 转换非零终止字符串或子字符串的最快方法是什么?
    • 回答: 使用 boost::iterator_range 进行转换,或者使用带两个参数的 lexical_cast 重载。例如,如果您想将字符串 str 中的两个字符转换为 int,您应该这样写:lexical_cast<int>(make_iterator_range(str.data(), str.data() + 2));lexical_cast<int>(str.data(), 2);

PrevUpHomeNext