##### Custom String Types

`boost::cnv::stream` accepts custom string and string-like types as input or output as long as they satisfy certain requirements.

    boost::cnv::cstream cnv;
    my_string        my_str("123");

    cnv(std::setprecision(2))(std::fixed);

    BOOST_TEST(convert<int>(my_str, cnv).value_or(0) == 123);

    BOOST_TEST(convert<my_string>( 99.999, cnv).value_or("bad") == "100.00");
    BOOST_TEST(convert<my_string>( 99.949, cnv).value_or("bad") ==  "99.95");
    BOOST_TEST(convert<my_string>(-99.949, cnv).value_or("bad") == "-99.95");

When a string-like type is the source, then it needs to be a contiguous sequence of the corresponding character type (`char` or `wchar_t`) accessible via `begin()` and `end()`.

`std::stringstream` is implemented entirely in terms of `std::basic_streambuf` which, in turn, operates on a contiguous character sequence, also called the buffer (see `std::basic_streambuf` for details). For efficiency reasons `boost::cnv::stream` uses the provided (read-only) input string as the buffer and, consequently, requires that provided input string to be a contiguous character sequence.

When a string is the target, then the described contiguous character sequence requirement does not apply. Any type that provides

    MyType::MyType(char const* beg, char const* end)

constructor can be deployed in type-to-string conversions.

See The Bigger Picture chapter for the discussion of potential advantages of deploying custom strings.