Boost logo

Boost :

From: Eric Niebler (eric_at_[hidden])
Date: 2007-04-27 20:16:20

Peter Dimov wrote:
> Eric Niebler wrote:
>> Peter Dimov wrote:
>>> Eric Niebler wrote:
>>>> Although I don't know all the details of bind and lambda, I had
>>>> hoped that _1 and _2 would be abstract proto entities, such that
>>>> _1 == _2
>>>> creates an expression template like:
>>>> equal< terminal< arg<1> >, terminal< arg<2> > >
>>>> which is a generic, abstract representation of an equals expression
>>>> with two placeholders. Can't bind and lambda both be implemented to
>>>> recognize such a type and do the appropriate thing with it?
>>> Possibly, if they are made to honor is_bind_expression
>>> specializations and result_of, if is_bind_expression reports true
>>> for the above type, if the above is a function object that actually
>>> returns x == y, and if result_of works for it.
>> Yes, that can all be made to work without much difficulty.
> The part about boost::bind using is_bind_expression and result_of cannot,
> not without major surgery and possibly compromising portability.

I'll have to take your word for it -- I'm not familiar enough with the
TR1 bind to appreciate the difficulty of respecting is_bind_expression.
It seems to me that is_bind_expression can be trivially implemented,
given appropriately defined placeholders. Eg. if they are defined in a
super-secret hidden namespace, like so:

namespace super_secret_hidden {
   template<class I> struct arg { typedef I arity; };
   template<class T> yes_type is_bind_expression_impl(T const *);
no_type is_bind_expression_impl(void const *);

Now _1 is:

proto::terminal<super_secret_hidden::arg<mpl::int_<1> > >::type const _1
= {{}};

And is_bind_expression<> is trivially implementable using ADL and
sizeof. Should work for older compilers, too, right? Are their compilers
we support that don't do ADL?

Result_of support for older compilers ... I suppose that requires
partial template specialization, right? Do we still support compilers
that don't do PTS?

> Sometimes I get excited about the new C++0x features and tell myself, why
> not rewrite boost::bind to take advantage of them? Then it occurs to me that
> C++0x has a std::bind built-in. :-) (Happened twice so far.)


Eric Niebler
Boost Consulting

Boost list run by bdawes at, gregod at, cpdaniel at, john at