作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目前,我已经实现了 Allocator 概念(指的是 Boost proposal )使用 C++20 constraints and concepts :
#include <concepts>
#include <iterator>
template <class A>
concept allocator =
std::copy_constructible<A> &&
std::equality_comparable<A> &&
requires(A a) {
{ a.allocate(0) } -> std::regular;
{ a.allocate(0) } -> std::constructible_from<std::nullptr_t>;
{ a.allocate(0) } -> std::equality_comparable_with<std::nullptr_t>;
{ a.allocate(0) } -> std::random_access_iterator;
{ *a.allocate(0) } -> std::same_as<typename A::value_type&>;
};
您可以看到相同的
allocate
有多个返回类型要求。功能。有没有办法将它们组合成一个单一的返回类型要求,如下所示?
{ a.allocate(0) } -> std::regular &&
std::constructible_from<std::nullptr_t> &&
std::equality_comparable_with<std::nullptr_t> &&
std::random_access_iterator;
最佳答案
对于这种特殊情况,您应该更密切地遵循这个概念。 allocator_traits<A>::allocate
的返回类型必须是 allocator_traits<A>::pointer
.所以这就是你应该测试的。是allocator_traits<A>::pointer
必须满足连续迭代器和可为空指针的各种约束。
所以代码应该是这样的:
template<typename P>
concept nullable_pointer =
std::regular<P> &&
std::convertible_to<std::nullptr_t, P> &&
std::assignable_from<P&, std::nullptr_t> &&
std::equality_comparable_with<P, std::nullptr_t>
template<typename P>
concept allocator_pointer =
nullable_pointer<P> &&
std::contiguous_iterator<P>;
template<typename A>
concept allocator =
std::copy_constructible<A> &&
std::equality_comparable<A> &&
requires(A a)
{
{ a.allocate(0) } -> allocator_pointer;
};
关于c++ - 如何将 C++20 约束的多个返回类型要求合并为一个返回类型要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63147287/
我是一名优秀的程序员,十分优秀!