Один мой друг спросил меня: "Как использовать CRTP для замены полиморфизма в многоуровневом наследовании". Точнее, в такой ситуации:
struct A {
void bar() {
// do something and then call foo (possibly) in the derived class:
foo();
}
// possibly non pure virtual
virtual void foo() const = 0;
}
struct B : A {
void foo() const override { /* do something */ }
}
struct C : B {
// possibly absent to not override B::foo().
void foo() const final { /* do something else */ }
}
Мы с моим другом понимаем, что CRTP не является заменой полиморфизма, но нас интересуют случаи, когда оба шаблона могут использоваться. (Ради этого вопроса нас не интересуют плюсы и минусы каждого шаблона.)
-
Этот question был задан раньше, но оказалось, что автор хотел реализовать именованный параметр idiom и свой собственный answer сосредоточиться на этой проблеме больше, чем на CRTP. С другой стороны, наиболее голосуемый ответ, похоже, касается метода производного класса, вызывающего его омоним в базовом классе.
-
Я придумал ответ (размещен ниже), который содержит довольно много кода шаблона, и мне интересно, есть ли более простые альтернативы.