表达概念中数据成员的概念要求的最佳方法是什么?

问题描述

为该类型的数据成员定义具有嵌套概念要求的概念的最佳方法是什么?遵循以下原则:

template<typename T>
concept MyConcept = requires(T a) {    
    {a.something} -> std::integral;
};

这不起作用,因为a.something被用作参考(delctype((a.something)))。我想出的最好的方法就是强制右值:

constexpr auto copy = [](auto value) { return value; };

template<typename T>
concept MyConcept = requires(T a) {    
    {copy(a.something)} -> std::integral;
};

我还有更好的选择吗?

解决方法

copy的缺点是它可以为您带来误报。参考成员将衰减到一个值。确保分析成员的实际类型的唯一方法是编写一个显式的嵌套需求。

template<typename T>
concept MyConcept = requires(T a) {    
    requires std::integral<decltype(a.something)>;
};
,

对于这种情况,创建一个专门用于引用积分的概念非常容易:

template<typename T>
concept integral_ref = std::is_reference_v<T> && std::integral<std::remove_reference_t<T>>;

然后您可以直接使用integral_ref

实际上,您甚至可以创建一个通用的reference_trait,它适用于期望对象类型的任何一元布尔类型特征:

template<typename T,template<typename> class Trait>
concept reference_trait = std::is_reference_v<T> && Trait<std::remove_reference_t<T>>::value;

template<typename T>
concept MyConcept = requires(T a) {    
    {a.something} -> reference_trait<std::is_integral>;
};