本文主要是介绍Boost :Lexical_cast,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
lexical_cast函数本身的代码非常短,如下:
template<typename Target, typename Source>
Target lexical_cast(Source arg)
{
detail::lexical_stream<Target, Source> interpreter;
Target result;
if(!(interpreter << arg && interpreter >> result))
throw_exception(bad_lexical_cast(typeid(Target), typeid(Source)));
return result;
}
返回将arg流入std::stringstream然后再作为Target对象取出的结果。转换就这样被当前的lexical_context参数化了。如果转换不成功,一个 bad_lexical_cast异常被抛出,否则一个Target对象被返回。
参数和结果类型的要求如下:
* Source 是可以流输出的,也就是说得提供一个左边是std::ostream对象,右边是一个 参数类型实例的 operator<< 操作符实现。
* Source 和 Target 都得是可拷贝构造的(提供拷贝构造函数) [20.1.3].
* Target 是可以流输入的,也就是说得提供一个左边是 std::istream 对象右边是 结果类型实例的 operator>> 操作符实现。
* Target 是可以 默认构造的, 就是说默认初始化一个该类型对象是可能的(提供默认构造函数)[8.5, 20.1.3].
* Target 是 可赋值的 [23.1].
bad_lexical_cast
class bad_lexical_cast : public std::bad_cast{public: virtual const char * what() const throw();};
主要的实现部分在lexical_stream的两个重载方法:<< 和 >> 中,
..........
bool operator<<(const Source &input)
{
return !(stream << input).fail();
}
template<typename InputStreamable>
bool operator>>(InputStreamable &output)
{
return !is_pointer<InputStreamable>::value &&
stream >> output &&
(stream >> std::ws).eof();
}
bool operator>>(std::string &output)
{
#if defined(BOOST_NO_STRINGSTREAM)
stream << '\0';
#endif
output = stream.str();
return true;
}
这篇关于Boost :Lexical_cast的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!