
From your description, I think I've done exactly this. E.g.
--8<---------------cut here---------------start------------->8--- template <class U> struct X { // member function void f(int) becomes something like: template <class T> typename enable_if< mpl::and_< is_convertible<T,int> , some_condition_on<U> > >::type f(T x_) { int x = x_; ... } }; --8<---------------cut here---------------end--------------->8--- That works as long as the function has at least one parameter that can be turned into a template, but I have some cases that are operators or else have no parameters. So for now I think I'll stick to the old "this member can't be instantiated unless T models X". It prevents explicit instantiation, but never mind I guess... BTW, it would be great if all these techniques could be added to the enable_if docs. Cheers, John.