Один способ избежать, чтобы предупреждение/поведение состояло в том, чтобы сделать POST через Ajax, затем отправьте пользователя в другую страницу (или не) отдельно.
Хотя снижение производительности - причина избегать использования dynamic_cast <>
для больших иерархий классов, это не единственная причина, по которой вы, возможно, захотите их избежать. Лучше или нет, не следует больше поощрять использование dyn_cast <>
из-за этого утверждения.
С другой стороны, нет абсолютно ничего плохого в использовании dynamic_cast <>
когда это лучший инструмент для работы. Если его использование оправдано и является самым чистым способом решения проблемы, то это всегда правильно, независимо от «распространенного высказывания».
Я бы определенно не избегал популярных проектов просто потому, что они используют dynamic_cast <>
s, goto
s или любая другая идиома, которая вышла из моды.
Я считаю, что динамические преобразования плохи не потому, что они медленные, а потому, что они подразумевают, что ваш код слишком тесно связан.
Я только очень быстро рассмотрел реализацию 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
возвращает true!
В любом случае, это поведение очень отличается от поведения dynamic_cast, поэтому я действительно не думаю, что вы можете сравнивать их с
Очевидно, я неправильно понимаю, что делает LLVM, поэтому, пожалуйста, дайте мне знать, если я не понял код!