Subject: Re: [boost] Formal Review Request: TypeErasure
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2012-05-23 23:53:19


AMDG

On 05/23/2012 07:12 PM, lcaminiti wrote:
>
> Hello Steven,
>
> I quickly read the docs (see a couple of minor comments below). I'll compile
> and play with the examples this weekend.
>
> I'm interested in the library. If you are looking for a Review Manager, I'd
> like to volunteer if that's OK with you and the Review Wizards.
>

It sounds good to me. You're a library author,
so I'm sure the Review Wizard will be okay with it.

> Minor Comments
>
> 1) It'd be nice to have a motivating example up front (something not trivial
> but not as complex as the range formatter either).
>

What about something based on any_printable?

typedef any<
  mpl::vector<
    copy_constructible<>,
    typeid_<>,
    ostreamable<> > > any_printable;

I believe that this has come up somewhere.
("Why can't I print boost::any to std::cout?")
Is this about the level of complexity
that you're thinking?

> 2) Why placeholders _a, _b, ... instead of _1, _2, ...?
>

Because they represent named arguments, not
positional arguments. I used _1, _2, etc.
in an earlier version of the library, and
some people were confused about how they
related to _1, _2 in Boost.Bind and Boost.MPL

> 3) I found the syntax of concept_interface difficult to understand... for
> example, Base looks arbitrary. But then it's very nice to be able to
> c.push_back(10) instead of call(...)
>
> 4) Same for overloaded concept_interface where both Base and Enable look
> arbitrary. (I wonder if macros could generate some of the boiler-plate code
> for the overload.)
>

Did you look at the doxygen/boostbook reference
for concept_interface? Is that sufficiently clear?

I realize that my descriptions in the examples
are often a bit sparse. Would something like
this be clearer? Do you think it's too verbose?

in custom.cpp:
    This works, but we'd really like to call `c.push_back(10)`.
    We can add members to __any by specializing __concept_interface.
    The first argument is `push_back`, since we want to inject a member
    into every __any that uses the `push_back` concept. The second
argument,
    Base, is used by the library to chain multiple uses of
__concept_interface
    together. We have to inherit from it publicly. Other than
    that we can ignore it. The third argument is the placeholder
    that represents this any. If someone used `push_back<_c, _b>`,
    we only want to insert a `push_back` member in the container,
    not the value type. Thus, the third argument is the container
    placeholder.

in overload.cpp:
    This uses SFINAE to detect whether a using declaration is
    needed. Note that the fourth argument of __concept_interface
    is a dummy parameter which is always void and is
    intended to be used for SFINAE.

> 5) There's a FIXME in the Reserved Identifier section.
>

Yeah. I haven't come up with any scheme that
covers all the identifiers I want to be able to
use without being too broad. I suppose I can
always ignore the issue until problems surface
like everyone else.

In Christ,
Steven Watanabe