你可以试试这样的。
#include <sstream>
//Try to convert arg to result in a similar way to boost::lexical_cast
//but return true/false rather than throwing an exception.
template<typename T1, typename T2>
bool convert( const T1 & arg, T2 & result )
{
std::stringstream interpreter;
return interpreter<<arg &&
interpreter>>result &&
interpreter.get() == std::stringstream::traits_type::eof();
}
template<typename T>
double to_double( const T & t )
{
double retval=0;
if( ! convert(t,retval) ) { /* Do something about failure */ }
return retval;
}
template<typename T>
double is_double( const T & t )
{
double retval=0;
return convert(t,retval) );
}
convert 函数的作用与 boost::lexical_cast 基本相同,除了词法转换更小心地避免使用固定缓冲区等分配动态存储。
可以将 boost::lexical_cast 代码重构为这种形式,但是该代码非常密集且难以运行 - 恕我直言,遗憾的是 lexical_cast 没有在引擎盖下使用类似这样的东西来实现......然后它可能看起来像这样:
template<typename T1, typename T2>
T1 lexical_cast( const T2 & t )
{
T1 retval;
if( ! try_cast<T1,T2>(t,retval) ) throw bad_lexical_cast();
return retval;
}