Какова мотивация статического полиморфизма в 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 ++?Когда его следует использовать? Каковы некоторые рекомендации?

Ответы на вопрос(3)

Ваш ответ на вопрос