
Actually you can use only one Handler class and some templated function overloads: template<class Base> class Hanlder { template<class Derived> void do_it(T const& t, typename boost::enable_if< boost::is_base_of<Base, T> >::type*=0) { //do smth. } template<class Derived> void do_it(boost::shared_ptr<T> t, typename boost::enable_if< boost::is_base_of<Base, T> >::type*=0) { //do smth. } .... }; Thanks Martin and Ovanes, I think you have put me on the right track there. Much appreciated. James Just a quick addendum to this. I tried out a combination of the two - using a BOOST_STATIC_ASSERT((boost::is_base_of<Base, T> >::value)) inside the do_it function described above, and found what I thought was odd behaviour with is_base_of. The following excerpt shows the behaviour class A {}; class B : public A {}; typedef A C; BOOST_STATIC_ASSERT((boost::is_base_of<A,B> >::value)) // this passes BOOST_STATIC_ASSERT((boost::is_base_of<A,C> >::value)) // this fails I would expect both to pass, as is_base_of should return true when both parameters are the same, and I thought that typedef did make classes the same/equivalent http://www.boost.org/doc/html/boost_typetraits/reference.html#boost_type traits.is_base_of Is there something I am missing about typedef? Or is boost::is_base_of unable to handles the aliasing? James This message (including any attachments) contains confidential and/or proprietary information intended only for the addressee. Any unauthorized disclosure, copying, distribution or reliance on the contents of this information is strictly prohibited and may constitute a violation of law. If you are not the intended recipient, please notify the sender immediately by responding to this e-mail, and delete the message from your system. If you have any questions about this e-mail please notify the sender immediately.