如何解决表达概念中数据成员的概念要求的最佳方法是什么?
为该类型的数据成员定义具有嵌套概念要求的概念的最佳方法是什么?遵循以下原则:
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>;
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。