
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