, : lite ( CRTP) ? ( ).
- CRTP. lite , :
template<typename T>
concept bool EqualityComparable()
{
return requires(T a, T b)
{
bool = {a == b};
bool = {a != b};
};
}
template<InputIterator I, EqualityComparable T>
I find(I first, I last, T x);
template<InputIterator I>
I find(I first, I last, EqualityComparable x);
, lite std::enable_if.
CRTP , , :
template<typename Derived>
void do_something(const CRTP_Base<Derived> &x);
CRTP , : , std::enable_shared_from_this :
class Widget : std::enable_shared_from_this<Widget>
{
};
CRTP - , Cloneable:
struct Base
{
typedef unique_ptr<Base> Unique;
virtual Unique clone() const = 0;
virtual ~Base() = default;
};
template<typename Derived>
struct ImplementCloneable: protected Base
{
Unique clone() const override
{
return Unique(new Derived(static_cast<const Derived&>(*this)));
}
protected:
~ImplementCloneable() = default;
};
struct Widget: ImplementCloneable<Widget>
{
};