Какова мотивация статического полиморфизма в C ++?
Я понимаю механикустатический полиморфизм с помощьюЛюбопытно повторяющийся шаблон, Я просто не понимаю, для чего это хорошо.
Заявленная мотивация:
Мы жертвуем некоторой гибкостью динамического полиморфизма дляскорость.
Но зачем что-то беспокоить?так сложно любить:
template <class Derived>
class Base
{
public:
void interface()
{
// ...
static_cast<Derived*>(this)->implementation();
// ...
}
};
class Derived : Base<Derived>
{
private:
void implementation();
};
Когда вы можете просто сделать:
class Base
{
public:
void interface();
}
class Derived : public Base
{
public:
void interface();
}
Мое лучшее предположение заключается в том, что в коде нет семантической разницы и что это просто вопрос хорошего стиля C ++.
Херб Саттер написал вExceptional C++ style: Chapter 18
это:
Предпочитаю делать виртуальные функции приватными.
Сопровождаемый конечно с подробным объяснением, почему этохороший стиль.
В контексте данного руководства первый примерхороший, потому что:
void implementation()
Функция в примере может претендовать на то, чтобы быть виртуальной, поскольку она здесь для выполнения настройки класса. Поэтому он должен быть частным.
И второй примерПлохо, поскольку:
Мы не должны вмешиваться в общедоступный интерфейс для выполнения настройки.
Мой вопрос:
Что мне не хватает в статическом полиморфизме? Это все о хорошем стиле C ++?Когда его следует использовать? Каковы некоторые рекомендации?