在概念中表达对数据成员的概念要求的最佳方式是什么?
What's the best way to express concept requirements for data members in a concept?
定义具有嵌套概念要求的概念的最佳方法是什么类型的数据成员?沿着这些线的东西:
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
。
事实上,您甚至可以创建泛型 a 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>;
};
定义具有嵌套概念要求的概念的最佳方法是什么类型的数据成员?沿着这些线的东西:
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
。
事实上,您甚至可以创建泛型 a 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>;
};