Проверка boost :: is_base_of .И если вы хотите сделать это сами, попробуйте код Алексея из этого вопроса :
typedef char (&yes)[1];
typedef char (&no)[2];
template <typename B, typename D>
struct Host
{
operator B*() const;
operator D*();
};
template <typename B, typename D>
struct is_base_of
{
template <typename T>
static yes check(D*, T);
static no check(B*, int);
static const bool value = sizeof(check(Host<B,D>(), int())) == sizeof(yes);
};
Редактировать .Написание статического утверждения не имеет большого значения, но вот оно:
#define STATIC_ASSERT(expr, msg) \
{ stat_assert<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
template<int>
struct stat_assert;
template<>
struct stat_assert<true>{};
Edit2. И вся работа, если вы не знаете, как объединить эти вещи: Код на ideone