所以我的问题如下:精简版概念能否以更方便的方式实现编译时多态性(正如我们目前可以通过 CRTP 所做的那样)?(欢迎提供代码示例)。
不 - 他们一般不会压制CRTP
。精简版概念主要是关于易于重载和定义泛型函数,以及易于语法检查:
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);
// or
template<InputIterator I>
I find(I first, I last, EqualityComparable x);
我认为概念精简版会抑制许多std::enable_if
.
CRTP
有不同的用例,其中一些确实与重载有关,例如:
template<typename Derived>
void do_something(const CRTP_Base<Derived> &x);
但CRTP
不限于重载,它还有其他应用:例如主要用例 forstd::enable_shared_from_this
并不意味着任何重载:
class Widget : std::enable_shared_from_this<Widget>
{
// ...
};
一些用例CRTP
甚至涉及虚拟功能 - 例如Cloneable
接口的自动实现:
// Simple example, no covariance, etc
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>
{
};