C++ 20 概念接受随机访问容器但拒绝 std::list

标签 c++ c++20 c++-concepts

std::vector 已知满足 RandomAccessContainer 的要求,因此使用 [] 运算符是常数时间。然而,std::list 只满足 ContainerReversibleContainer 的较弱要求,因此检索一个元素是 O(N),而且[] 运算符不存在。

我想约束一个模板,以便每当 [] 运算符不存在或不是 O(1) 时,我都能得到一个很好的编译时错误。我怎样才能做到这一点?

目前,在 g++ 11.2.0 上,使用 std::list:

实例化以下模板时,我无法收到干净的错误消息
template<typename RandomAccessContainer>
void foo(RandomAccessContainer const & x);
template<typename ContiguousContainer>
void foo(ContiguousContainer const & x);
template<typename T>
requires ContiguousContainer<T>
void foo(T const & x);

最佳答案

Ranges 库带有一堆与范围相关的概念。在这种情况下,您需要:

template <std::ranges::random_access_range R>
void foo(R&& x);

这个概念不检查范围本身是否有 [] (无论如何这对你来说是不够的,map 提供了但不是随机访问),但是它确实检查迭代器是随机访问迭代器,并且随机访问迭代器本身需要支持索引。

因此,您必须编写 ranges::begin(x)[2] 而不是 x[2]

关于C++ 20 概念接受随机访问容器但拒绝 std::list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71289600/

相关文章:

c++ - boost 共享互斥锁检查是否锁定在同一个线程中

c++ - 如何添加和读取两种类型变量的 vector 元素

c++ - WriteFile重叠和fwrite等效

c++ - 如何使用 range::sort 进行由 bool 值控制的升序或降序排序

c++ - 为什么 require 子句中的否定表达式需要括号?

c++ - 在类声明中使用概念

c++ - 将整数转换为 ascii 值 C++

c++ - 为什么std::visit in a unsatisfied concept会导致gcc编译错误

c++ - 如何编写结构化绑定(bind)的概念?

C++ 检查语句是否可以评估 constexpr