#include #include #include #include #include void fn_1(int){} void fn_2(int,int){} void fn_3(int,int,int){} void fn_0(){} namespace _bi=boost::_bi; template struct nargs; template struct argpos; template struct argpos > { enum{value=pos}; }; template struct argpos<_bi::value > { enum{value=0}; }; template struct nargs<_bi::bind_t >{enum {value=0};}; template struct nargs< _bi::bind_t< R, F, _bi::list1 > > {enum {value=argpos::value};}; template struct max { enum{value=lhs > rhs?lhs:rhs}; }; template struct nargs< _bi::bind_t< R, F, _bi::list2 > > { enum { argpos1=argpos::value, argpos2=argpos::value, value=max::value }; }; template struct nargs< _bi::bind_t< R, F, _bi::list3 > > { enum { argpos1=argpos::value, argpos2=argpos::value, argpos3=argpos::value, value=max::value>::value }; }; template void bind_nargs(BindExpr) { BOOST_STATIC_ASSERT(nargs::value==value); } int main() { bind_nargs<0>(boost::bind(&fn_0)); int a=1,b=3; // when all args are supplied, should be 0 bind_nargs<0>(boost::bind(&fn_2,a,b)); bind_nargs<0>(boost::bind(&fn_0)); bind_nargs<4>(boost::bind(&fn_1,_4)); bind_nargs<9>(boost::bind(&fn_2,_8,_9)); bind_nargs<2>(boost::bind(&fn_2,_1,_2)); bind_nargs<2>(boost::bind(&fn_2,_1,_2)); bind_nargs<1>(boost::bind(&fn_3,_1,_1,_1)); }