Я только очень быстро взглянул на реализацию dyn_cast и isa в документации LLVM.
Пример в коде имеет следующее:
struct bar {
bar() {}
private:
bar(const bar &);
};
struct foo {
void ext() const;
/* static bool classof(const bar *X) {
cerr << "Classof: " << X << "\n";
return true;
}*/
};
template <> inline bool isa_impl<foo,bar>(const bar &Val) {
errs() << "Classof: " << &Val << "\n";
return true;
}
Тест вызывается с B
и имеет:
if (!isa<foo>(B1)) return;
if (!isa<foo>(B2)) return;
Если я правильно понимаю, что происходит, шаблон isa
(который используется dyn_cast
) использует явную специализацию isa_impl
, чтобы связать панель с foo. В приведенных примерах кажется, что isa<foo>(B1)
возвращает true!
Во всяком случае, это поведение очень отличается от поведения dynamic_cast, поэтому я действительно не думаю, что вы можете сравнить их друг с другом.
Очевидно, что я неправильно понимаю, что делает LLVM, поэтому, пожалуйста, дайте мне знать, если я не понял код!