|
Boost : |
From: d.frey_at_[hidden]
Date: 2000-12-01 07:57:00
Hi,
I think I found out why the old version used 'S arg' instead of 'const
S& arg'. I tried to specialize lexical_cast. I failed to specialize
for T == S, I managed to specialize lexical_cast< string, string > and
I managed to specialize lexical_cast< string, const char* > but I had
to replace 'const S& arg' by 'S arg' to make the last one work. Here's
some code:
#include <iostream>
#include <string>
#include <strstream>
#include <typeinfo>
class bad_lexical_cast : public std::bad_cast
{
public:
virtual const char* what() const throw()
{
return "bad_lexical_cast";
}
};
template< typename T, typename S > T lexical_cast( S arg )
{
cout << "1.";
std::strstream interpreter;
T result;
if(!(interpreter << arg) ||
!(interpreter >> result) ||
!(interpreter >> std::ws).eof())
{
throw bad_lexical_cast();
}
return result;
}
/* How to specialize for T == S ???
template< typename U > template<> U lexical_cast< U, U >( U arg )
{
cout << "X.";
return arg;
}
*/
// Only neccessary if the above isn't possible:
template<> string lexical_cast< string, string >( string arg )
{
cout << "2.";
return arg;
}
// This only work for lexical_cast's argument being declared as 'S
arg' and not 'const S& arg'
template<> string lexical_cast< string, const char* >( const char* arg
)
{
cout << "3.";
return string( arg );
}
int main()
{
try {
std::cout << lexical_cast< std::string >(
std::string("Hello, world!") ) << endl;
std::cout << lexical_cast< std::string >(
"Hello, world!" ) << endl;
}
catch( std::exception& e ){
cerr << e.what();
}
return 0;
}
Regards, Daniel
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk