Actual source code: crtp.hpp

  1: #pragma once

  3: namespace Petsc
  4: {

  6: namespace util
  7: {

  9: // A useful crtp helper class to abstract away all the static_cast(this) nonsense
 10: template <template <typename, typename...> class CRTPType, typename Derived, typename... T>
 11: class crtp {
 12: protected:
 13:   Derived       &underlying() noexcept { return static_cast<Derived &>(*this); }
 14:   const Derived &underlying() const noexcept { return static_cast<const Derived &>(*this); }

 16: private:
 17:   // private constructor + friend decl preempts any diamond dependency problems
 18:   // https://www.fluentcpp.com/2017/05/19/crtp-helper/
 19:   constexpr crtp() noexcept = default;
 20:   friend CRTPType<Derived, T...>;
 21: };

 23: } // namespace util

 25: } // namespace Petsc