Boost C++ 库

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

提要 - Boost C++ 函数库
PrevUpHomeNext

boost/lexical_cast.hpp 中定义的库特性

namespace boost
{
    class bad_lexical_cast;

    template<typename Target, typename Source>
      Target lexical_cast(const Source& arg);

    template <typename Target>
      Target lexical_cast(const AnyCharacterType* chars, std::size_t count);

    namespace conversion
    {
        template<typename Target, typename Source>
            bool try_lexical_convert(const Source& arg, Target& result);

        template <typename AnyCharacterType, typename Target>
            bool try_lexical_convert(const AnyCharacterType* chars, std::size_t count, Target& result);

    } // namespace conversion
} // namespace boost

template<typename Target, typename Source>
  Target lexical_cast(const Source& arg);

返回将 arg 流式传输到标准库基于字符串的流中,然后作为 Target 对象输出的结果。其中 Target 是 std::stringstd::wstring,流提取将获取字符串的全部内容,包括空格,而不是依赖默认的 operator>> 行为。如果转换不成功,将抛出 bad_lexical_cast 异常。

template <typename Target>
  Target lexical_cast(const AnyCharacterType* chars, std::size_t count);

将 count 个字符的数组作为输入参数,并将它们流式传输为 Target 对象。如果转换不成功,将抛出 bad_lexical_cast 异常。此调用可能有助于处理非零终止的字符数组或仅处理字符数组的某一部分。

两个函数对参数和结果类型的要求如下:

  • Source 是 OutputStreamable,意味着定义了一个 operator<<,它在左侧接受一个 std::ostreamstd::wostream 对象,在右侧接受参数类型的实例。
  • Target 是 InputStreamable,意味着定义了一个 operator>>,它在左侧接受一个 std::istreamstd::wistream 对象,在右侧接受结果类型的实例。
  • Target 是 CopyConstructible [20.1.3]。
  • Target 是 DefaultConstructible,意味着可以对该类型的对象进行默认初始化 [8.5, 20.1.4]。

底层流的字符类型假定为 char,除非 Source 或 Target 需要宽字符流式传输,在这种情况下,底层流使用 wchar_t。以下类型也可以使用 char16_tchar32_t 进行宽字符流式传输:

  • 单个字符:char16_t, char32_t
  • 字符数组:char16_t *, char32_t *, const char16_t *, const char32_t *
  • 字符串:std::basic_string, boost::containers::basic_string
  • boost::iterator_range<WideCharPtr>,其中 WideCharPtr 是指向宽字符或指向 const 宽字符的指针
  • boost::array<CharT, N>std::array<CharT, N>, boost::array<const CharT, N>std::array<const CharT, N>
[Important] 重要提示

许多编译器和运行时库在处理新的 Unicode 字符时转换失败。在使用新类型之前,请确保以下代码可以编译并输出非零值。

std::cout
    << boost::lexical_cast<std::u32string>(1.0).size()
    << "  "
    << boost::lexical_cast<std::u16string>(1.0).size();

当需要更高的转换控制级别时,std::stringstreamstd::wstringstream 提供了更合适的途径。当需要非基于流的转换时,lexical_cast 是不适合的工具,并且不对此类场景进行特殊处理。

class bad_lexical_cast : public std::bad_cast
{
public:
    ... // same member function interface as std::exception
};

用于指示运行时 lexical_cast 失败的异常。

boost::lexical_cast 仍然是词法转换的主要接口。在大多数情况下,必须默认使用它。但是,一些开发人员希望创建自己的转换函数,重用 boost::lexical_cast 的所有优化。这时 boost::conversion::try_lexical_convert 函数就派上用场了。

try_lexical_convert 在转换成功时返回 true,否则返回 false。如果转换失败并返回 false,则 result 输出变量的状态未定义。

实际上,boost::lexical_cast 是使用 try_lexical_convert 实现的。

template <typename Target, typename Source>
inline Target lexical_cast(const Source &arg)
{
    Target result;

    if (!conversion::try_lexical_convert(arg, result))
        throw bad_lexical_cast();

    return result;
}

try_lexical_convert 放宽了对 Target 类型的 CopyConstructible 和 DefaultConstructible 要求。对 TargetSource 的以下要求仍然保留:

  • Source 必须是 OutputStreamable,意味着定义了一个 operator<<,它在左侧接受一个 std::ostreamstd::wostream 对象,在右侧接受参数类型的实例。
  • Target 必须是 InputStreamable,意味着定义了一个 operator>>,它在左侧接受一个 std::istreamstd::wistream 对象,在右侧接受结果类型的实例。

PrevUpHomeNext