Без Boost вы можете использовать что-то вроде следующего, чтобы определить, может ли указатель на тип неявно приводиться к другому указателю на тип:
template <class Derived, class Base>
struct IsConvertible
{
template <class T>
static char test(T*);
template <class T>
static double test(...);
static const bool value = sizeof(test<Base>(static_cast<Derived*>(0))) == 1;
};
Чтобы вызвать ошибку во время компиляции, теперь вы можете использовать value
в выражении, которое вызывает ошибку, если оно ложно, например typedef массива отрицательного размера.
template <typename T>
class foo
{
public:
foo ()
{
typedef T assert_at_compile_time[IsConvertible<T, _base>::value ? 1 : -1];
}
};