
"John Maddock" <john@johnmaddock.co.uk> writes:
some code:
template <typename DerivedT> class A { BOOST_STATIC_ASSERT((boost::is_convertible<A<DerivedT>*, B*>::value)); [...] };
class B : public A<B> { };
I want to check if the template parameter really specifies a derived type. But the assert is always false. How can i solve this?
I think your code should be:
template <typename DerivedT> class A { BOOST_STATIC_ASSERT((::boost::is_convertible<DerivedT*, A<DerivedT>*>::value)); // this should work as well: BOOST_STATIC_ASSERT((::boost::is_base_and_derived<A<DerivedT>, DerivedT>::value)); };
class B : public A<B> { };
However, the static asserts still always get triggered, and I'm not sure why: any language lawyers understand this?
Because B is an incomplete class in A's body, so the inheritance is invisible. It's complete inside of A's member functions; you could do the assert there... -- Dave Abrahams Boost Consulting http://www.boost-consulting.com