A: 

Making Attach() a template would allow you to do what you're aiming for. The code gets messy but it let's you call it the way you want.

template<typename A1>
void Attach(A1 a1);

template<typename A1, typename A2>
void Attach(A1 a1, A2 a2);

template<typename A1, typename A2, typename A3>
void Attach(A1 a1, A2 a2, A3 a3);

template<typename A1, typename A3, typename A4>
void Attach(A1 a1, A2 a2, A3 a3, A4 a4);
SilverSun
+1  A: 

Overload Attach for different numbers of parameters in the member function:

template<typename R,typename T,typename U>
void Attach(R (T::*pmf)(),U* p))
{
    Attach(boost::bind(pmf,p));
}

template<typename R,typename T,typename U,typename A1>
void Attach(R (T::*pmf)(A1),U* p))
{
    Attach(boost::bind(pmf,p,_1));
}

template<typename R,typename T,typename U,typename A1,typename A2>
void Attach(R (T::*pmf)(A1,A2),U* p))
{
    Attach(boost::bind(pmf,p,_1,_2));
}

If you need to handle const member functions too then you'll need a second set of overloads.

Anthony Williams
Brilliant. I changed it slightly to work with shared_ptr (so I can hold weak_ptr references and drop .expired() pointers before firing off the event). Otherwise, it's a great solution. Thanks.
Robinson