        template< typename Target
                , typename Source
                , bool Unlimited // string representation of Source is unlimited
                , typename CharT
                >
        struct lexical_cast<boost::optional<Target>, Source, Unlimited, CharT>
        {
            typedef BOOST_DEDUCED_TYPENAME
                deduce_char_traits<CharT,boost::optional<Target>,Source>::type traits;

            typedef BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
                lcast_streambuf_for_target<boost::optional<Target> >::value ||
                lcast_streambuf_for_source<Source>::value
              , std::basic_streambuf<CharT>
              , lexical_streambuf_fake
              >::type base;

            boost::optional<Target> operator()(
                BOOST_DEDUCED_TYPENAME boost::call_traits<Source>::param_type arg,
                CharT* buf, std::size_t src_len)
            {
                BOOST_DEDUCED_TYPENAME boost::mpl::if_c<
                    Unlimited
                  , detail::lexical_stream<boost::optional<Target>,Source,traits>
                  , detail::lexical_stream_limited_src<CharT,base,traits>
                  >::type interpreter(buf, buf + src_len);

                if(interpreter << arg) {
                    boost::optional<Target> result;
                    if(interpreter >> result)
                        return result;
                }
                return boost::optional<Target>();
            }
        };