|
Boost : |
Subject: Re: [boost] Variadic append for std::string
From: Richard Hodges (hodges.r_at_[hidden])
Date: 2017-01-23 13:43:49
> Why not fold the name concat into the format string?
Because format strings are evil. They cause errors that can only be
detected at runtime, and that is not a Good Thing (tm).
On 23 January 2017 at 19:26, Olaf van der Spek <ml_at_[hidden]> wrote:
> On Mon, Jan 23, 2017 at 5:32 PM, Christof Donat <cd_at_[hidden]> wrote:
>
> > Hi,
> >
> > Am 23.01.2017 16:32, schrieb Hans Dembinski:
> >
> >> On 23 Jan 2017, at 11:23, Christof Donat <cd_at_[hidden]> wrote:
> >>> auto my_new_str =
> >>> concat("Hello ",
> >>> join(", ",std::begin(my_nums), std::end(my_nums)),
> >>> format(" the file %1% contains %2% bytes", filename,
> >>> filesize)).str();
> >>>
> >>
> >> It makes sense to me for "join" to return a string factory, because it
> >> is likely to be nested in "concat". But I don't see the practical case
> >> of nested "concat" calls, at least it is not going to be a common
> >> pattern in the need of optimising.
> >>
> >
> > There is several usecases:
> >
> > 1. scope for formatting tags:
> >
> > concat(format::hex<int>, 42, " is hex for ", concat(42)).str();
> >
> > Here the inner concat will convert the 42 to its decimal representation,
> > while the outer one converts the first 42 to its hex representation.
> >
>
> Wouldn't concat(hex(42), " is hex for", 42) make more sense?
>
>
> >
> > 2. concat() in calls to format():
> >
> > format("%|1$40t|%2%", concat(first_name, " ", last_name),
> > phone_number).str();
> >
> > Why not fold the name concat into the format string?
>
>
> > format().str() will allocate the buffer and ask the concat string factory
> > to write into it.
> >
> > 3. results from concat() in a boost::range that is passed to join():
> >
> > join(separator("\n"),
> > my_files | transformed([](const std::filesystem::path& f) -> auto {
> > return concat(f.filename, ": ",
> > std::filesystem::file_size(f));
> > })).str();
> >
> > join().str() will ask every concat string factory to render directly into
> > the common buffer.
> >
> > If "concat" is the outer layer anyway, I would return a std::string
> >> directly for convenience. It is easy to forget the trailing .str() and
> >> it does not look elegant.
> >>
> >
> > Of course better proposals are welcome :-) Would you prefer the implicit
> > conversion? If so, why?
>
>
> Implicit is problematic with auto..
>
>
> --
> Olaf
>
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/
> mailman/listinfo.cgi/boost
>
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk