Boost logo

Boost :

Subject: Re: [boost] Boost.Convert+Boost.Parameter
From: Vladimir Batov (batov_at_[hidden])
Date: 2009-03-04 02:50:41


> From: "Emil Dotchevski" <emildotchevski_at_[hidden]>
> ...
> Generic algorithms shouldn't target containers as such, instead
> containers should be accessed in terms of iterators.

I believe generic containers do target containers. The standard algorithms
are iterator-based. However, RangeEx and string_algo algorithms works with
ranges which IMHO a considerable step foward compared to the standard
iterator-based algorithms.

> By the way, have
> you ever needed to convert a vector<char> to int?

The point is that "convert" works with boost::range-compatible containers
that include vector<char>.

> If you think about the standard library stream operators, they nail
> down one of the arguments as a stream. In string conversions, ideally
> we should nail down the source or the return as a "string" because
> otherwise the interface is too generic.

I am of an pinion that we do that:

int i = convert<int>::from(string);
string s = convert<string>::from(i);

As you can see "the source or the return are nailed down as a "string".

> The problem is that there is no single string type in C++. If we have
> a function that converts to string, should it return std::string,
> std::wstring, char const *, wchar_t const *? Should it support
> user-defined string types?

If the user wants "char const*" suported, he will implement such a
conversion as:

char const* s = convert<char const*>::from(i);

> One possible line of thought is to say oh well, we need to accommodate
> all of the above.

User-specific need will be accommodated on when-needed basis.

> That leads to lexical_cast-style interface (I
> suspect that the proposed convert<> interface can in fact be
> implemented as an extension of lexical_cast.)

That's been my original request. You can see the relevant lexical_cast
discussion and the decision to proceed with something like "convert".

> I'd rather limit the interface to std::string/std::wstring and types
> that can be implicitly converted to string/wstring. So the question is
> how to provide this limitation?

I honestly do not see such a need or any value in doing so.

> A template like convert<std::string> or to_string<std::string> can't
> provide this limitation.

Yes, that was exactly the goal.

> I'd prefer to_string specifically to discourage
> users from thinking about supporting non-string types,

The provided code does not provide any non-string conversions. If the user
needs such he can do that himself. IMHO it should be their choice rather
than yours.

> ...
> "Bonus" implies that the generalization is desirable. :)

No, bonus means you get something for nothing (say, see
http://dictionary.reference.com/browse/bonus)

convert<Target>(source) says "convert any source I pass in to an
object of static type Target."

> For what it's worth, I want the to-string interface to say "convert
> any source I pass in to string" where string could be std::string/char
> const * (or std::wstring/wchar_t const *)

That's what

    convert<string>::from(source)

says. If you want conversion to "char const*", you'll implement that
conversion yourself and then will use it as

    convert<char const*>::from(source)

V.


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