CRTP

Curiously recurring template pattern

Назначение

Идиома CRTP предоставляет статическое полиморфное поведение без использования виртуальных функций, что позволяет увеличить производительность за счет отказа от динамического связывания.

CRTP использует наследование и шаблоны для создания связи между базовым классом и его производным классом.

Идиома CRTP разделяет функциональность, зависящую от типа и связывает функциональность, независимую от типа, с базовым классом, используя шаблон с "саморекурсией".

Решаемые задачи

  • достижение статического полиморфизма

  • получение возможности повторного использования кода

Пример реализации идиомы CRTP

template <class derived>
struct compare {};

struct value : compare<value> 
{
    int m_x;
    value(int x) : m_x(x) {}
    bool operator<(const value &rhs) const 
    { 
        return m_x < rhs.m_x; 
    }
};

template <class derived>
bool operator > (const compare<derived> &lhs, const compare<derived> &rhs) 
{
    // static_assert(std::is_base_of_v<compare<derived>, derived>); // Безопасность времени компиляции
    return (static_cast<const derived&>(rhs) < static_cast<const derived&>(lhs));
}

int main() 
{
    value v1{5}, v2{10};
    cout << boolalpha << "v1 > v2: " << (v1 > v2) << '\n';
    return 0;
}

Last updated

Was this helpful?