Boost logo

Boost Users :

Subject: Re: [Boost-users] [thread] Ambiguity in variadic wait_for_all
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2017-02-07 17:51:38


Le 03/02/2017 à 02:38, Gavin Lambert a écrit :
> A colleague recently ran into an interesting issue when upgrading some
> working code from Boost 1.55 to 1.60/1.63 (and from C++03 to C++11).
>
> The exact details are unimportant, but it was trying to get the
> address of boost::wait_for_all(Iterator, Iterator), for use in a
> Boost.Bind call.
>
> In 1.55, this worked fine, although of course it had to supply
> template parameters that proved the parameters were not futures (thus
> causing enable_if<is_future_type<F1>> to fail, disabling the
> two-future-args overload of the function.
>
> In 1.60/1.63, the variadic method is encountered instead, which lacks
> any enable_if condition and thus the ambiguity between the two remains
> and the compiler errors out. (When calling it directly, the variadic
> one manages to get disabled as long as the iterator type lacks a
> wait() method, but this doesn't apply when just getting the method
> address, as it's not part of the signature.)
>
> Should the variadic form also have enable_if? Or is this considered
> user error for trying to use Bind in a variadic-compatible compiler
> instead of using a lambda?
Hi,

I will suggest you to replace the call to bind by lambdas whenever you can.

You have made two changes IIUC, boost version and compiler version, so I
don't know if this is a regression in boost 1.53 or a behavior that
different between c++02 and C++11. I suspect that it is the change to
C++11.

Curiously I added enable if only for the function with two arguments,
but not for the others.
     template<typename F1,typename F2>
     typename boost::enable_if<is_future_type<F1>,void>::type
wait_for_all(F1& f1,F2& f2)

When I added the C++11 version I surely forget to add the enable_if.

Please, could you try to add the enable_if to the variadic template and
tell me if this would fix your issue?

     template<typename F1, typename... Fs>
*typename boost::enable_if<is_future_type<F1>,void>::type*
wait_for_all(F1& f1, Fs&... fs)

Best,
Vicente



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net