Ticket #11308: bind.4.patch

File bind.4.patch, 11.9 KB (added by gerald.langlois@…, 7 years ago)

Using boost::disable to remove ambiguity

  • bind.hpp

     
    2929#include <boost/bind/arg.hpp>
    3030#include <boost/detail/workaround.hpp>
    3131#include <boost/visit_each.hpp>
     32#include <boost/core/enable_if.hpp>
     33#include <boost/type_traits/is_same.hpp>
    3234
    3335// Borland-specific bug, visit_each() silently fails to produce code
    3436
     
    18801882#define BOOST_BIND_MF_NAME(X) X
    18811883#define BOOST_BIND_MF_CC
    18821884
     1885
    18831886#include <boost/bind/bind_mf_cc.hpp>
    18841887#include <boost/bind/bind_mf2_cc.hpp>
    18851888
  • bind_mf_cc.hpp

     
    3636
    3737template<class Rt2, class R, class T,
    3838    class A1>
    39     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf0)<R, T>, typename _bi::list_av_1<A1>::type>
     39        typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf0)<R, T>, typename _bi::list_av_1<A1>::type> >::type
    4040    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (), A1 a1)
    4141{
    4242    typedef _mfi::BOOST_BIND_MF_NAME(mf0)<R, T> F;
     
    4646
    4747template<class Rt2, class R, class T,
    4848    class A1>
    49     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf0)<R, T>, typename _bi::list_av_1<A1>::type>
     49    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf0)<R, T>, typename _bi::list_av_1<A1>::type> >::type
    5050    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) () const, A1 a1)
    5151{
    5252    typedef _mfi::BOOST_BIND_MF_NAME(cmf0)<R, T> F;
     
    8181template<class Rt2, class R, class T,
    8282    class B1,
    8383    class A1, class A2>
    84     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf1)<R, T, B1>, typename _bi::list_av_2<A1, A2>::type>
     84    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf1)<R, T, B1>, typename _bi::list_av_2<A1, A2>::type> >::type
    8585    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1), A1 a1, A2 a2)
    8686{
    8787    typedef _mfi::BOOST_BIND_MF_NAME(mf1)<R, T, B1> F;
     
    9292template<class Rt2, class R, class T,
    9393    class B1,
    9494    class A1, class A2>
    95     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf1)<R, T, B1>, typename _bi::list_av_2<A1, A2>::type>
     95    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf1)<R, T, B1>, typename _bi::list_av_2<A1, A2>::type> >::type
    9696    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1) const, A1 a1, A2 a2)
    9797{
    9898    typedef _mfi::BOOST_BIND_MF_NAME(cmf1)<R, T, B1> F;
     
    127127template<class Rt2, class R, class T,
    128128    class B1, class B2,
    129129    class A1, class A2, class A3>
    130     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf2)<R, T, B1, B2>, typename _bi::list_av_3<A1, A2, A3>::type>
     130    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf2)<R, T, B1, B2>, typename _bi::list_av_3<A1, A2, A3>::type> >::type
    131131    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2), A1 a1, A2 a2, A3 a3)
    132132{
    133133    typedef _mfi::BOOST_BIND_MF_NAME(mf2)<R, T, B1, B2> F;
     
    138138template<class Rt2, class R, class T,
    139139    class B1, class B2,
    140140    class A1, class A2, class A3>
    141     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf2)<R, T, B1, B2>, typename _bi::list_av_3<A1, A2, A3>::type>
     141    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf2)<R, T, B1, B2>, typename _bi::list_av_3<A1, A2, A3>::type> >::type
    142142    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2) const, A1 a1, A2 a2, A3 a3)
    143143{
    144144    typedef _mfi::BOOST_BIND_MF_NAME(cmf2)<R, T, B1, B2> F;
     
    173173template<class Rt2, class R, class T,
    174174    class B1, class B2, class B3,
    175175    class A1, class A2, class A3, class A4>
    176     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf3)<R, T, B1, B2, B3>, typename _bi::list_av_4<A1, A2, A3, A4>::type>
     176    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf3)<R, T, B1, B2, B3>, typename _bi::list_av_4<A1, A2, A3, A4>::type> >::type
    177177    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3), A1 a1, A2 a2, A3 a3, A4 a4)
    178178{
    179179    typedef _mfi::BOOST_BIND_MF_NAME(mf3)<R, T, B1, B2, B3> F;
     
    184184template<class Rt2, class R, class T,
    185185    class B1, class B2, class B3,
    186186    class A1, class A2, class A3, class A4>
    187     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf3)<R, T, B1, B2, B3>, typename _bi::list_av_4<A1, A2, A3, A4>::type>
     187    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf3)<R, T, B1, B2, B3>, typename _bi::list_av_4<A1, A2, A3, A4>::type> >::type
    188188    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3) const, A1 a1, A2 a2, A3 a3, A4 a4)
    189189{
    190190    typedef _mfi::BOOST_BIND_MF_NAME(cmf3)<R, T, B1, B2, B3> F;
     
    219219template<class Rt2, class R, class T,
    220220    class B1, class B2, class B3, class B4,
    221221    class A1, class A2, class A3, class A4, class A5>
    222     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf4)<R, T, B1, B2, B3, B4>, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type>
     222    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf4)<R, T, B1, B2, B3, B4>, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type> >::type
    223223    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
    224224{
    225225    typedef _mfi::BOOST_BIND_MF_NAME(mf4)<R, T, B1, B2, B3, B4> F;
     
    230230template<class Rt2, class R, class T,
    231231    class B1, class B2, class B3, class B4,
    232232    class A1, class A2, class A3, class A4, class A5>
    233     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf4)<R, T, B1, B2, B3, B4>, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type>
     233    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf4)<R, T, B1, B2, B3, B4>, typename _bi::list_av_5<A1, A2, A3, A4, A5>::type> >::type
    234234    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5)
    235235{
    236236    typedef _mfi::BOOST_BIND_MF_NAME(cmf4)<R, T, B1, B2, B3, B4> F;
     
    265265template<class Rt2, class R, class T,
    266266    class B1, class B2, class B3, class B4, class B5,
    267267    class A1, class A2, class A3, class A4, class A5, class A6>
    268     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf5)<R, T, B1, B2, B3, B4, B5>, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type>
     268    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf5)<R, T, B1, B2, B3, B4, B5>, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type> >::type
    269269    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
    270270{
    271271    typedef _mfi::BOOST_BIND_MF_NAME(mf5)<R, T, B1, B2, B3, B4, B5> F;
     
    276276template<class Rt2, class R, class T,
    277277    class B1, class B2, class B3, class B4, class B5,
    278278    class A1, class A2, class A3, class A4, class A5, class A6>
    279     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf5)<R, T, B1, B2, B3, B4, B5>, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type>
     279    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf5)<R, T, B1, B2, B3, B4, B5>, typename _bi::list_av_6<A1, A2, A3, A4, A5, A6>::type> >::type
    280280    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6)
    281281{
    282282    typedef _mfi::BOOST_BIND_MF_NAME(cmf5)<R, T, B1, B2, B3, B4, B5> F;
     
    311311template<class Rt2, class R, class T,
    312312    class B1, class B2, class B3, class B4, class B5, class B6,
    313313    class A1, class A2, class A3, class A4, class A5, class A6, class A7>
    314     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf6)<R, T, B1, B2, B3, B4, B5, B6>, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type>
     314    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf6)<R, T, B1, B2, B3, B4, B5, B6>, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type> >::type
    315315    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
    316316{
    317317    typedef _mfi::BOOST_BIND_MF_NAME(mf6)<R, T, B1, B2, B3, B4, B5, B6> F;
     
    322322template<class Rt2, class R, class T,
    323323    class B1, class B2, class B3, class B4, class B5, class B6,
    324324    class A1, class A2, class A3, class A4, class A5, class A6, class A7>
    325     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf6)<R, T, B1, B2, B3, B4, B5, B6>, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type>
     325    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf6)<R, T, B1, B2, B3, B4, B5, B6>, typename _bi::list_av_7<A1, A2, A3, A4, A5, A6, A7>::type> >::type
    326326    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7)
    327327{
    328328    typedef _mfi::BOOST_BIND_MF_NAME(cmf6)<R, T, B1, B2, B3, B4, B5, B6> F;
     
    357357template<class Rt2, class R, class T,
    358358    class B1, class B2, class B3, class B4, class B5, class B6, class B7,
    359359    class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
    360     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf7)<R, T, B1, B2, B3, B4, B5, B6, B7>, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type>
     360    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf7)<R, T, B1, B2, B3, B4, B5, B6, B7>, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type> >::type
    361361    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
    362362{
    363363    typedef _mfi::BOOST_BIND_MF_NAME(mf7)<R, T, B1, B2, B3, B4, B5, B6, B7> F;
     
    368368template<class Rt2, class R, class T,
    369369    class B1, class B2, class B3, class B4, class B5, class B6, class B7,
    370370    class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8>
    371     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf7)<R, T, B1, B2, B3, B4, B5, B6, B7>, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type>
     371    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf7)<R, T, B1, B2, B3, B4, B5, B6, B7>, typename _bi::list_av_8<A1, A2, A3, A4, A5, A6, A7, A8>::type> >::type
    372372    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8)
    373373{
    374374    typedef _mfi::BOOST_BIND_MF_NAME(cmf7)<R, T, B1, B2, B3, B4, B5, B6, B7> F;
     
    403403template<class Rt2, class R, class T,
    404404    class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8,
    405405    class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
    406     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8>, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type>
     406    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(mf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8>, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type> >::type
    407407    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8), A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
    408408{
    409409    typedef _mfi::BOOST_BIND_MF_NAME(mf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8> F;
     
    414414template<class Rt2, class R, class T,
    415415    class B1, class B2, class B3, class B4, class B5, class B6, class B7, class B8,
    416416    class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9>
    417     _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8>, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type>
     417    typename disable_if<is_same<Rt2, R>, _bi::bind_t<Rt2, _mfi::BOOST_BIND_MF_NAME(cmf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8>, typename _bi::list_av_9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type> >::type
    418418    BOOST_BIND(R (BOOST_BIND_MF_CC T::*f) (B1, B2, B3, B4, B5, B6, B7, B8) const, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9)
    419419{
    420420    typedef _mfi::BOOST_BIND_MF_NAME(cmf8)<R, T, B1, B2, B3, B4, B5, B6, B7, B8> F;