I’ve often pondered the advantages and disadvantages of CRTP vs a policy based design. CRTP always seemed
a bit of a hack to me, so I’ve favoured policies. I recently came across an interesting rationale for
choosing CRTP in the Boost iterator_facade
documentation at
https://www.boost.org/doc/libs/1_65_0/libs/iterator/doc/iterator_facade.html#overview
Here’s the extract:
Iterator facade uses the Curiously Recurring Template Pattern (CRTP) [Cop95] so that the user can specify the behavior of
iterator_facade
in a derived class. Former designs used policy objects to specify the behavior, but that approach was discarded for several reasons:
- the creation and eventual copying of the policy object may create overhead that can be avoided with the current approach.
- The policy object approach does not allow for custom constructors on the created iterator types, an essential feature if
iterator_facade
should be used in other library implementations.- Without the use of CRTP, the standard requirement that an iterator’s operator++ returns the iterator type itself would mean that all iterators built with the library would have to be specializations of
iterator_facade<...>
, rather than something more descriptive likeindirect_iterator<T*>
. Cumbersome type generator metafunctions would be needed to build new parameterized iterators, and a separateiterator_adaptor
layer would be impossible.[Cop95] [Coplien, 1995] Coplien, J., Curiously Recurring Template Patterns, C++ Report, February 1995, pp. 24-27.