gpt4 book ai didi

c++ - 受限CRTP过早拒绝

转载 作者:行者123 更新时间:2023-12-04 07:22:40 26 4
gpt4 key购买 nike

我正在尝试实现从基模板继承的派生类,将派生类作为其模板参数(希望下面的示例可以解决问题):

template <class T>
struct S
{
T f() {return T();}
};

struct D : public S<D>
{
};
这也可以在 gcc、clang 和 msvc 上编译并运行良好。现在,我想“确保”模板参数继承自基类:
#include <concepts>

template <class T>
concept C
= requires ( T t )
{
{ t.f() };
};

template <C T>
struct S
{
T f() {return T();}
};

struct D : public S<D>
{
};
然而,这被每个编译器拒绝,clang 提供了最多的洞察力:
error: constraints not satisfied for class template 'S' [with T = D]
struct D : public S<D>
^~~~
note: because 'D' does not satisfy 'C'
template <C T>
^
note: because 't.f()' would be invalid: member access into incomplete type 'D'
{ t.f() };
我知道编译器来自哪里: D当必须检查约束时还没有完全定义,因此它失败代替必要的信息。也就是说,我有点失望,在评估尚未检查的约束之前没有尝试完成派生类的定义。
这种行为是有意的吗?有没有另一种方法来检查实际工作的继承?
顺便说一句,gcc 给出了一个相当无用的 error message在这种情况下。

最佳答案

您可以在基类的默认构造函数中检查要求

#include <type_traits>

template<class Derived>
class Base
{
public:
Base()
{
static_assert(std::is_base_of_v<Base<Derived>, Derived>);
}
};

class Derived : public Base<Derived>
{ };
这也必须在任何其他用户定义的非复制和非移动 base 构造函数中进行检查。这是有效的 Derived在构造函数实例化时完全定义。

关于c++ - 受限CRTP过早拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68401401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com