Boost logo

Boost :

Subject: Re: [boost] [Fit] formal review starts today
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2016-03-05 11:15:41


AMDG

On 03/05/2016 01:36 AM, Vicente J. Botet Escriba wrote:
> Le 05/03/2016 01:11, Paul Fultz II a écrit :
>>
>> On Friday, March 4, 2016 at 5:19:52 PM UTC-6, Steven Watanabe wrote:
>>>
>>> On 03/04/2016 11:55 AM, Vicente J. Botet Escriba wrote:
>>>>
>>> #include <boost/fit/conditional.hpp>
>>>
>>> struct identity {
>>> template<class T>
>>> T operator()(T t) { return t; }
>>> };
>>>
>>> int main() {
>>> boost::fit::conditional(identity(), identity())(0);
>>> }
>>>
>>> 1> boost\fit\conditional.hpp(84): error C2500:
>>> 'boost::fit::detail::conditional_kernel<F1,F2>': 'identity' is already a
>>> direct base class
>>> 1> with
>>> 1> [
>>> 1> F1=identity,
>>> 1> F2=identity
>>> 1> ]
>>> 1>
>>>
>> This is by design. I should document this. It makes absolutely no
>> sense to
>> pass the same function to conditional, and is most likely a mistake in
>> the
>> users code.
>>
>

  I disagree that this makes no sense. It
would be true if we were talking about match,
but for conditional, this degenerate case has
a clear meaning, since conditional chooses
the first possible function. Forbidding it
creates a special case, and special cases
are bad for generic code. Of course, my
example is a bit silly, because I was
trying to create a minimal reproduction,
but it's quite possible to have a situation
where you don't know and don't care whether
the arguments are the same type.
(warning: untested code)

template<class S, class F>
T my_accumulate(const S& s, T val, F f)
{
    fusion::for_each(s,
      phoenix::ref(val) += phoenix::bind(conditional(f, identity), _1));
    return val;
}

my_accumulate(fusion::make_vector(1, 2, 3), 0, identity);

In Christ,
Steven Watanabe


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