//T could converted to U ? template<typename T, typename U> class Conversion { private: typedef char Small; struct Big{ char big[2]; }; static Small _helper_fun(U); static Big _helper_fun(...); static T _make_T(); public: enum { Exists = (sizeof(_helper_fun(_make_T())) == sizeof(Small)), Exists2Way = ( Exists && Conversion<U,T>::Exists), Same = false }; }; // partial specialization for "same type" template<typename T> class Conversion<T, T> { public: enum{ Exists = true, Exists2Way = true, Same = true }; }; // T is subclass of U ? template<typename T, typename U> class IsSubclass { public: enum{ Result = Conversion<T*, U*>::Exists }; };