Boost logo

Boost :

Subject: Re: [boost] Formal Review Request: TypeErasure
From: Larry Evans (cppljevans_at_[hidden])
Date: 2012-06-26 14:41:58


On 05/22/12 15:34, Steven Watanabe wrote:
[snip]
> I'd like to request a formal review of the
> TypeErasure library that I've posted about
> several times before here.
>
> The TypeErasure library is a generalization
> of boost::any and boost::function. It
> allows easy composition of arbitrary
> type erased operators.
[snip]
> The library is available in the Boost Sandbox at
> http://svn.boost.org/svn/boost/sandbox/type_erasure/
[snip]
Shouldn't at least one of the template args to a concept definition be
a placeholder? The docs don't explicitly say this:

*/libs/type_erasure/doc/html/boost_typeerasure/concept.html#boost_typeerasure.concept.custom

    states:

      Let's define a concept to allow push_back on a sequence. To do
      this, we create a class template with a template parameter for
      each argument, and a static member function called apply that
      calls push_back.

    Now the example following that paragraph does have a placeholder;
    however, the quoted paragraph doesn't state that it's needed.

  */libs/type_erasure/doc/html/boost_typeerasure/conceptdef.html

    states:

      The template parameters of the concept may involve placeholders.

        * Each template argument may be a cv and/or reference
          qualified placeholder type.

        * If a template argument is a function type, its arguments and
          return type may be cv/reference qualified placeholders.

    but, because of the 'may's it doesn't require a placeholder.

Now, obviously, the placeholder is the only way to retrieve the value
of the data stored in the any, and you could reason that a placeholder
is obviously needed; however, I think that needs to be explicitly
stated so there's no confusion (I confess, I was actually confused by
this and it took several trials before I finally concluded that a
placeholder was required).

The attached file, when compiled with:

  #define MODEL_DEFAULT_SELF

compiles and runs OK. However, with:

  //#define MODEL_DEFAULT_SELF

gcc4.8 fails to compile it and gives a very obscure error message
containing:

../../../boost/type_erasure/call.hpp:530:89: required from 'typename
boost::type_erasure::detail::call_result<Op, void(U0&)>::type
boost::type_erasure::call(const Op&, U0&) [with Op = concept<>; U0 =
int; typename boost::type_erasure::detail::call_result<Op,
void(U0&)>::type = void]'
concept_ph.cpp:84:5: required from here
../../../boost/type_erasure/detail/get_signature.hpp:23:5: error:
incomplete type 'void' used in nested name specifier
     BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested, &Concept::apply)
     ^

which seems to support the position that some placeholder is required
in the concept's template arguments, AFAICT.

HTH.

-regards,
Larry




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