Boost logo

Boost Users :

From: tslettebo1 (terje.s_at_[hidden])
Date: 2002-05-20 21:48:45


--- In Boost-Users_at_y..., "Jason Fischl" <yg-boost-users_at_m...> wrote:
> I'm seeing a problem with lexical_cast. The following code when
trying to
> convert from string to
> string fails when passed an empty string. The library code that is
doing
> this lexical_cast does
> not and can not know that the input and output types are the same.
>
> I believe that this code should not throw.
>
> #include <iostream>
> #include <boost/lexical_cast.hpp>
>
> main()
> {
> std::string input("");
> try
> {
> boost::lexical_cast<std::string>(input);
> }
> catch (boost::bad_lexical_cast& e)
> {
> std::cout << "Failed" << std::endl;
> }
> }

Since one can't partially specialise function templates, one way to
do it could be that the library included something like this:

namespace boost
{
  template<>
  std::string lexical_cast<std::string,std::string>(std::string arg)
  {
  return arg;
  }

  template<>
  std::string lexical_cast<std::string,const char *>(const char *arg)
  {
  return arg;
  }

  template<>
  std::string lexical_cast<std::string,char *>(char *arg)
  {
  return arg;
  }
}

This is quite brittle, though, as it only works for the types given.
It does work for your example, for Intel C++ and VC++, though (the
compilers I've tested it with).

If partial specialisation was possible, you could do:

namespace boost
{
  template<class T>
  T lexical_cast<T,T>(T arg)
  {
  return arg;
  }
}

Interestingly, the person behind lexical_cast, Kevlin Henney, is on
the standards committee, and in this case, a language change could
help his library. :)

Regards,

Terje


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net