template <typename T>
class Wrapper
{
// ...
};
这是打算被推导出来的。
class Type : Wrapper<Type>
{
// ...
};
我想通过对模板参数
T
设置约束来加强这一点。有一个 friend
的技巧可以实现这一点,但我认为在概念的时代应该有更好的方法。我的第一次尝试是#include <concepts>
template <typename T>
requires std::derived_from<T, Wrapper<T>>
class Wrapper
{
// ...
};
但是这样做不起作用,因为我在声明
Wrapper
之前引用它。我找到了一些解决方法,但并不完全令人满意。我可以将约束条件添加到构造函数中。Wrapper() requires std::derived_from<T, Wrapper<T>>;
但是如果我有更多需要限制的构造函数,那样做就不方便了。我可以通过析构函数来实现。
~Wrapper() requires std::derived_from<T, Wrapper<T>> = default;
但是这样声明析构函数只是为了在上面加上
requires
感觉有点傻。我想知道是否有更好、更惯用的方法来做到这一点。特别是,虽然这些方法似乎可以工作(在gcc 10上测试过),但有一件令人不满意的事情是,如果我从
Wrapper<OtherType>
派生Type
,那么只有在我实例化Type
时才会引发错误。是否可能在定义Type
的地方就出现错误?
static_assert(std::derived_from<T, Wrapper<T>>)
对于这种情况也不起作用,因为T
是不完整的。https://godbolt.org/z/y-jVGZ - Justin