Я понимаю, что динамический / статический полиморфизм зависит от дизайна приложения и требований.Однако рекомендуется ли ВСЕГДА выбирать статический полиморфизм, а не динамический, если это возможно?В частности, я вижу следующие два варианта дизайна в моем приложении, оба из которых, по-видимому, не рекомендуются:
Реализация статического полиморфизма с использованием CRTP: нет затрат на поиск в vtable, но при этом обеспечиваетсяинтерфейс в виде базового класса шаблона.Но, использует много переключателя и static_cast для доступа к правильному классу / методу, который является опаснымкак аксессоры / мутаторы
Мое приложение очень критично ко времени, поэтому я поддерживаю статический полиморфизм.Но нужно знать, является ли использование слишком большого количества static_cast показателем плохого дизайна и как избежать этого без задержки.
РЕДАКТИРОВАТЬ: Спасибо за понимание.Возьмем конкретный случай, какой из них лучше?
class IMessage_Type_1
{
virtual long getQuantity() =0;
...
}
class Message_Type_1_Impl: public IMessage_Type_1
{
long getQuantity() { return _qty;}
...
}
ИЛИ
template <class T>
class TMessage_Type_1
{
long getQuantity() { return static_cast<T*>(this)->getQuantity(); }
...
}
class Message_Type_1_Impl: public TMessage_Type_1<Message_Type_1_Impl>
{
long getQuantity() { return _qty; }
...
}
Обратите внимание, что в каждом классе есть несколько мутаторов / аксессоров, и мне нужно указатьинтерфейс в моем приложении.В статическом полиморфизме я переключаюсь только один раз - чтобы получить тип сообщения.Однако в динамическом полиморфизме я использую виртуальные функции для вызова КАЖДОГО метода.Разве это не значит использовать статический поли?Я полагаю, что static_cast в CRTP вполне безопасен и не снижает производительность (время компиляции ограничено)?