在 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::string
或 std::wstring
,流提取将获取字符串的全部内容,包括空格,而不是依赖默认的 operator>>
行为。如果转换不成功,将抛出 bad_lexical_cast
异常。
template <typename Target> Target lexical_cast(const AnyCharacterType* chars, std::size_t count);
将 count 个字符的数组作为输入参数,并将它们流式传输为 Target 对象。如果转换不成功,将抛出 bad_lexical_cast
异常。此调用可能有助于处理非零终止的字符数组或仅处理字符数组的某一部分。
两个函数对参数和结果类型的要求如下:
operator<<
,它在左侧接受一个 std::ostream
或 std::wostream
对象,在右侧接受参数类型的实例。operator>>
,它在左侧接受一个 std::istream
或 std::wistream
对象,在右侧接受结果类型的实例。底层流的字符类型假定为 char
,除非 Source 或 Target 需要宽字符流式传输,在这种情况下,底层流使用 wchar_t
。以下类型也可以使用 char16_t
或 char32_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>
![]() |
重要提示 |
---|---|
许多编译器和运行时库在处理新的 Unicode 字符时转换失败。在使用新类型之前,请确保以下代码可以编译并输出非零值。 std::cout << boost::lexical_cast<std::u32string>(1.0).size() << " " << boost::lexical_cast<std::u16string>(1.0).size();
|
当需要更高的转换控制级别时,std::stringstream
和 std::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 要求。对 Target
和 Source
的以下要求仍然保留:
operator<<
,它在左侧接受一个 std::ostream
或 std::wostream
对象,在右侧接受参数类型的实例。operator>>
,它在左侧接受一个 std::istream
或 std::wistream
对象,在右侧接受结果类型的实例。