c++ - 如何测试 member 在概念上是否完整?

标签 c++ c++20

<分区>

我正在尝试定义一个概念来测试特定成员变量(在示例中为“x”)是否存在并且是否为整数类型。不过,我感到很困惑,因为 v.x 返回一个 int&,因此 std::integral 检查失败。我怎样才能使它工作?

#include <concepts>

template <typename T>
concept isIntegralX = requires(T v) {
    {v.x} -> std::integral;
};

template <typename T>
requires isIntegralX<T>
void bar(const T& base)
{
}

class Foo
{
public:
    int x{0};

    void baz()
    {
        bar<Foo>(*this);
    }
};

int main()
{
    return 0;
}

错误:

note: the expression 'is_integral_v<_Tp> [with _Tp = int&]' evaluated to 'false'

最佳答案

您可以将概念更改为:

template <typename T>
concept isIntegralX = std::is_integral_v<decltype(T::x)>;

decltype(T::x) 在此处产生确切的类型 int

对于多个成员你可以

template <typename T>
concept isIntegralXandY = std::is_integral_v<decltype(T::x)> && std::is_integral_v<decltype(T::y)>;

关于c++ - 如何测试 member 在概念上是否完整?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69793811/

相关文章:

c++ - 在 C++ 中对引用的引用是非法的吗?

c++ - 如何修复错误 invalid inirection 和 lvalue

c++ - 由于优化代码重新排序

c++ - 使用运算符删除动态但仍然存在内存泄漏

c++ - 使用 std::shared_ptr 时的内存新删除类型不匹配

c++ - 如何在 qt 网络中使用 https?

c++ - 如何消除并行 std::transform_reduce() 的中间容器?

c++ - 为可选<T>实现运算符<=>

c++ - 我如何围绕概念和不完整类型的限制进行设计?

c++ - 如果 catch 不执行任何操作,编译器优化会删除 try/catch block 吗?