【问题标题】:Compare named requirement expressed with C++20 concepts比较用 C++20 概念表达的命名需求
【发布时间】:2023-03-07 01:51:01
【问题描述】:

我正在写一个排序算法,它带有一个比较函数,similar to std::sort:

template <class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp);

在我看来,模板参数CompareCompare named requirement 完美匹配。我试图了解如何使用 C++ 20 概念指定该约束,例如 std::strict_weak_orderstd::equivalence_relation,但我有点困惑。

如果我引用the article on cppreference

类型 T 满足 比较 if T 类型满足 BinaryPredicate 和 Given
comp,T 类型的对象 equiv(a, b),相当于!comp(a, b) &amp;&amp; !comp(b, a)的表达式

std::strict_weak_ordering 可以在上面的描述中捕获我对comp 的约束,但是equiv 呢? std::equivalence_relation 将关系作为第一个模板参数。我的排序功能会是什么?

【问题讨论】:

  • 有什么原因您不想使用std::sortable 函数使用的std::sortable 要求吗?
  • @NicolBolas Urg,谢谢。这正是我想要的。我想知道为什么他们没有在 cppreferences 上使用 std::sort 的概念。他们只在std::ranges::sort 中使用它。我也在查看这里的列表:en.cppreference.com/w/cpp/header/concepts。那里没有提到std::sortable
  • std::sortablesort 的要求,而不是比较器的要求。比较器仍应满足std::strict_weak_order(或std::indirect_strict_weak_order,视情况而定)。
  • equiv(a,b) 定义为与!comp(a,b) &amp;&amp; !comp(b,a) 相同,it 应满足std::equivalence_relation

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


【解决方案1】:

在 C++ 中,命名需求的功能比概念和约束更广泛。

例如,我可以有一些算法停止的命名要求。另一方面,没有办法提出一个需要算法停止的概念。

概念可以检查某些事情,但不能检查所有内容。所以命名的需求比较首先说事物必须是一个 BinaryPredicate。 BinaryPredicate 可以描述为一个概念,并作为一个约束提供。

确认

if comp(a,b)==true then comp(b,a)==false

将需要添加 C++ 的证明子系统并将正式证明与 comp 一起传递,或者检查您传递给 comp 的类型的每个值。

在某些语言中,您可以传递属性的形式证明,并检查这些形式证明以验证函数参数。 C++ 不是其中之一。

赖斯定理指出,您无法获取代码并验证其重要属性。要实现与您想要的类似的东西,必须用您声称的证明来扩充代码。然后,约束可能需要这些额外信息。使用 Turing tar 坑,您甚至可以使用此功能增强 C++,但之后它看起来不像 C++(这来自我,他喜欢在 C++ 中添加命名运算符以获得乐趣)。

TL;DR 并非所有命名的需求都可以表示为概念。概念可以检查一些事情,但不能检查所有事情。记录超出概念约束参数的附加要求是 C++ 中的一件事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多