gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:04:51 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com