AMDG Ares Lagae wrote:
I have a base class template "template <typename T1, typename T2> struct base {};" and a derived class "derived" that publicly derives from several instantiations from the base class template.
Given a type "T1", is it possible to decide if the class "derived" is derived from a base "base<T1,X>" and deduce the unknown type "X"?
I couldn't think of a way to do this without typeof. (At least without enumerating all the possible first template arguments) #include <boost/typeof/typeof.hpp> #include <boost/mpl/bool.hpp> #include <boost/mpl/assert.hpp> #include <boost/type_traits/is_same.hpp> namespace mpl = boost::mpl; struct no { typedef void type; }; template<class U> struct wrap { no dummy[2]; typedef U type; }; template<class T1, class T2> struct X {}; template<class T, class U1> struct derives_from_X { private: template<class U2> static wrap<U2> test(X<U1, U2>*); static no test(...); BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested, test((T*)0)); typedef typename nested::type result; public: typedef typename result::type template_argument; typedef mpl::bool_<sizeof(result) != sizeof(no)> type; enum { value = type::value }; }; struct tester : X<int, char>, X<void, double> {}; int main() { BOOST_MPL_ASSERT((derives_from_X<tester, int>)); BOOST_MPL_ASSERT((boost::is_same<derives_from_X<tester, int>::template_argument, char>)); BOOST_MPL_ASSERT((derives_from_X<tester, void>)); BOOST_MPL_ASSERT((boost::is_same<derives_from_X<tester, void>::template_argument, double>)); } In Christ, Steven Watanabe