HardCRTPшаблоны
Что такое CRTP (Curiously Recurring Template Pattern)?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
CRTP: class Derived : public Base<Derived> — класс наследует шаблон базы, параметризованный самим собой. База знает тип производного и может вызывать его методы через static_cast. Это статический полиморфизм — выбор метода в compile-time, без vtable.
template<class Derived>
class Comparable {
public:
bool operator<(const Derived& other) const {
return static_cast<const Derived*>(this)->compare(other) < 0;
}
};
class Score : public Comparable<Score> {
int v_;
public:
int compare(const Score& o) const { return v_ - o.v_; }
};
Score a{1}, b{2};
bool less = (a < b); // инлайнится, нет vtable overhead- Применения: миксины, policy-based design (
enable_shared_from_this,iterator), static interfaces; - Недостатки: сложность чтения, нельзя хранить heterogeneous collection of Deriveds.
CRTP мощен для generic библиотек, в прикладном коде используется реже.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.