CRTP

Let's learn about CRTP in this lesson.

CRTP #

The acronym CRTP stands for the C++ idiom Curiously Recurring Template Pattern. It is a technique in C++ in which a Derived class derives from a class template Base. The key is that Base has Derived as a template argument.

Let’s have a look at an example:

template<class T> 
class Base{
   ...
};

class Derived: public Base<Derived>{ 
   ...
};

CRTP enables static polymorphism.

Typical use-case #

There are two typical use-cases for CRTP: Mixins and static polymorphism.

Mixins #

Mixins are a popular concept in the design of classes used to mix in new code. Therefore, it’s a technique often used in Python to change the behavior of a class by using multiple inheritances. In contrast to C++, it is legal in Python to have more than one definition of a method in a class hierarchy. Python simply uses the first method in the Method Resolution Order (MRO).

We can implement mixins in C++ by using CRTP. A prominent example is the class std::enable_shared_from_this. Using this class, we can create objects that return an std::shared_ptr with themselves. We have to derive the public class MySharedClass from std::enable_shared_from_this. Now, our MySharedClass has a method called shared_from_this.

An additional common use-case for mixins is a class that we want to extend with the capability that their instances support the comparison for equality and inequality.

Static polymorphism #

Static polymorphism is quite similar to dynamic polymorphism. But contrary to dynamic polymorphism with virtual methods, the dispatch of the method calls will take place at compile-time. Now, we are at the center of the CRTP idiom.

class ShareMe: public std::enable_shared_from_this<ShareMe>{
  std::shared_ptr<ShareMe> getShared(){
    return shared_from_this();
  } 
};
  • std::enable_shared_from_this creates a shared _ptr for an object.
  • std::enable_shared_from_this: is the base class of the object.
  • shared_from_this: returns the shared object.

Further information #


In the next lesson, we’ll look at a couple of examples of CRTP.

Get hands-on with 1200+ tech skills courses.