このようなことを試すことができます。
#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;
}