Может привести к виду safe_reinterpret_cast<B>(a) как в остальных случаях?
Да
boost::is_base_of что-то похожее, можно почерпнуть оттуда идею.
boost::type_traits мне не помог (мож чего проглядел).
boost::is_base_of в таких случаях, при downcast, всегда будет говорить "да". Важно установить, что при downcast'e к базовому классу численное значение указателя не изменится.
class A {...};
class B {...};
class C : public A, public B {...};
C c;
B* pb = &c;
C* pc = &c;
void* pb_value = reinterpret_cast<void*>(pb);
void* pc_value = reinterpret_cast<void*>(pc);
assert(pb == pc); // не вопрос
assert(pb_value == pc_value); // Опс
Т.е. в то время как сами указатели равны (pb == pc), их численные значения в общем случае не равны (pb_value != pc_value).