gpt4 book ai didi

c++ - C++20 std::common_reference 的目的是什么?

转载 作者:行者123 更新时间:2023-12-02 08:43:07 25 4
gpt4 key购买 nike

C++20 引入 std::common_reference 。它的目的是什么?有人可以举个使用它的例子吗?

最佳答案

common_reference这是我努力想出一个容纳代理迭代器的 STL 迭代器概念的结果。

在 STL 中,迭代器有两个特别令人感兴趣的关联类型: referencevalue_type 。前者是迭代器operator*的返回类型,以及 value_type是序列元素的(非常量、非引用)类型。

通用算法通常需要做这样的事情:

value_type tmp = *it;

...所以我们知道这两种类型之间一定存在某种关系。对于非代理迭代器,关系很简单:reference总是value_type ,可选 const 和引用限定。 Early attempts at defining the InputIterator concept要求表达式*it可转换为const value_type & ,对于大多数有趣的迭代器来说这就足够了。

我希望 C++20 中的迭代器比这更强大。例如,考虑 zip_iterator 的需求以锁步方式迭代两个序列。当您取消引用zip_iterator时,你会得到一个临时的pair两个迭代器的 reference 类型。所以,zip 'ing vector<int>和一个 vector<double>将具有以下关联类型:

zip迭代器的reference :pair<int &, double &>
zip迭代器的value_type :pair<int, double>

正如您所看到的,这两种类型并不简单地通过添加顶级 cv- 和 ref 资格来相互关联。然而让这两种类型任意不同感觉是错误的。显然这里存在某种关系。但两者之间的关系是什么?对迭代器进行操作的通用算法可以安全地假设这两种类型是什么?

C++20 中的答案是,对于任何有效的迭代器类型(无论是否代理),类型 reference &&value_type &共享一个通用引用。换句话说,对于某些迭代器 it有某种类型CR这使得以下格式良好:

void foo(CR) // CR is the common reference for iterator I
{}

void algo( I it, iter_value_t<I> val )
{
foo(val); // OK, lvalue to value_type convertible to CR
foo(*it); // OK, reference convertible to CR
}

CR是共同的引用。所有算法都可以依赖该类型存在的事实,并且可以使用 std::common_reference来计算它。

所以,这就是 common_reference 的角色在 C++20 中运行 STL。一般来说,除非您正在编写通用算法或代理迭代器,否则您可以放心地忽略它。它在幕后确保您的迭代器履行其契约(Contract)义务。

<小时/>

编辑:OP还要求提供一个例子。这有点做作,但想象一下它是 C++20,并且给你一个随机访问范围 r类型 R你对此一无所知,但你想sort范围。

进一步想象一下,由于某种原因,您想要使用单态比较函数,例如 std::less<T> 。 (也许您已经键入删除了范围,并且还需要键入删除比较函数并将其传递给 virtual ?再次,拉伸(stretch)。) T 应该做什么?位于std::less<T> ?为此,您可以使用 common_reference ,或助手 iter_common_reference_t这是根据它实现的。

using CR = std::iter_common_reference_t<std::ranges::iterator_t<R>>;
std::ranges::sort(r, std::less<CR>{});

即使范围 r 也保证可以工作。有代理迭代器。

关于c++ - C++20 std::common_reference 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59011331/

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