Я понимаю механику статического полиморфизма с помощью любопытно повторяющегося шаблона шаблона. Я просто не понимаю, для чего это полезно.
Заявленная мотивация такова:
Мы жертвуем некоторой гибкостью динамического полиморфизма для скорости.
Но зачем беспокоиться о чем-то таком сложном, как:
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();
}
Моя лучшая догадка заключается в том, что в коде нет семантической разницы и что это всего лишь хороший стиль С++.
Херб Саттер написал в Exceptional C++ style: Chapter 18
, что:
Предпочитают делать частные виртуальные функции.
Сопровождается, конечно, с подробным объяснением, почему это хороший стиль.
В контексте этого руководства первый пример хороший, потому что:
Функция void implementation()
в примере может претендовать на виртуальность, так как здесь требуется выполнить настройку класса. Поэтому он должен быть закрытым.
И второй пример bad, так как:
Мы не должны вмешиваться в открытый интерфейс для выполнения настройки.
Мой вопрос:
- Что мне не хватает в статическом полиморфизме? Это все о хорошем стиле С++?
- Когда он должен использоваться? Каковы некоторые рекомендации?