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