## Converters in Detail

### boost::cnv::lexical_cast Converter

The purpose of the converter is to

- Make use of the `boost::lexical_cast` functionality and performance that many people have become accustomed to and comfortable with;
- Demonstrate how existing independent conversion/transformation-related facilities might be incorporated in to the Boost.Convert framework.

The converter can easily replace `boost::lexical_cast`, adding flexibility and convenience:

    #include <boost/convert.hpp>
    #include <boost/convert/lexical_cast.hpp>
    #include <boost/detail/lightweight_test.hpp>

    using std::string;
    using boost::convert;
    using boost::lexical_cast;

    struct boost::cnv::by_default : boost::cnv::lexical_cast {};

    int    i1 = lexical_cast<int>("123");         // Throws if the conversion fails.
    int    i2 = convert<int>("123").value();      // Throws if the conversion fails.
    int    i3 = convert<int>("uhm").value_or(-1); // Returns -1 if the conversion fails.
    string s1 = lexical_cast<string>(123);
    string s2 = convert<string>(123).value();

    BOOST_TEST(i1 == 123);
    BOOST_TEST(i2 == 123);
    BOOST_TEST(i3 == -1);
    BOOST_TEST(s1 == "123");
    BOOST_TEST(s2 == "123");

See the `boost::cnv::lexical_cast implementation` for details.

In order for a user-defined type to be integrated into the `boost::lexical_cast` framework and, consequently, deployed with the `boost::cnv::lexical_cast` converter:

- TypeOut needs to be Copy Constructible;
- TypeOut needs to be Default Constructible;
- TypeOut needs to be Input Streamable;
- TypeIn needs to be Output Streamable.

The first two requirements are imposed by the `boost::lexical_cast` design and implementation and the last two requirements by the underlying `std::stringstream` engine.