Although type erasure isn't related to CRTP, it fits in nicely with our current example, which is why we're showing it here.
The type erasure idiom is about hiding the concrete type under a polymorphic interface. A great example of this approach can be found in Sean Parent's talk Inheritance Is The Base Class of Evil from the GoingNative 2013 conference. We highly recommend you watch it in your spare time; you can find a link to it in the Further reading section. In the standard library, you can find it in std::function, std::shared_ptr's deleter, or std::any, among others.
The convenience of use and flexibility comes at a price – this idiom needs to use pointers and virtual dispatch, which makes the mentioned utilities from the standard library bad to use in performance-oriented use cases. Beware.
To introduce type erasure to our example, we no longer need CRTP. This time, our GlamorousItem class will wrap dynamically polymorphic...