Boost logo

Boost :

Subject: Re: [boost] Formal Review Request: Boost.Convert
From: Emil Dotchevski (emildotchevski_at_[hidden])
Date: 2009-02-27 14:29:50


On Fri, Feb 27, 2009 at 11:14 AM, Stewart, Robert
<Robert.Stewart_at_[hidden]> wrote:
> On Friday, February 27, 2009 2:06 PM
> Emil Dotchevski wrote:
>> On Fri, Feb 27, 2009 at 10:52 AM, Stewart, Robert
>> <Robert.Stewart_at_[hidden]> wrote:
>> > On Friday, February 27, 2009 1:48 PM
>> > Emil Dotchevski wrote:
>> >> On Fri, Feb 27, 2009 at 5:30 AM, Stewart, Robert
>> >> <Robert.Stewart_at_[hidden]> wrote:
>> >> >
>> >> > The framework uses IOStreams to do its work.  I believe the
>> >> > conversion functionality for the uuid type is captured via:
>> >> >
>> >> >   namespace user
>> >> >   {
>> >> >      class uuid;
>> >> >
>> >> >      template <class Stream>
>> >> >      Stream &
>> >> >      operator <<(Stream &, uuid const &);
>> >> >   }
>> >>
>> >> If operator<< was a reasonable to-string alternative, we
>> >> wouldn't be
>> >> needing a library for it.
>> >
>> > That is the purpose of the insertion operator: it produces
>> > a character sequence from the right hand argument.
>>
>> No, its purpose is to implement dumping of objects in streams, in
>> terms of other existing operator<< overloads. This can also be used to
>> convert to string, but the streams framework is rather clumsy to use
>> when you need a std::string.
>
> I hope you're not being purposely obtuse.  I raised the insertion operator as the spelling of the hook for the library because the library will use a std::ostringstream to produce the (formatted) output.  Since UDTs frequently provide such an operator, the convert code will piggy back on those operators easily, thus turning them into a handy means of converting to a string.

Operator<< overloads don't solve the problem of converting to string
well. Boost::lexical_cast isn't either. I was assuming that anyone who
considers yet another to-string conversion interface was on board with
that. :)

> My point was it was a loop.  How do you resolve it?

The loop case is when you call convert. Basically you need to detect
if the overload resolution for operator<< will bind the generic
operator<< overload provided by convert, and in that case induce a
compile error.

Emil Dotchevski
Reverge Studios, Inc.
http://www.revergestudios.com/reblog/index.php?n=ReCode


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk