比较用 C++20 概念表达的命名需求
Compare named requirement expressed with C++20 concepts
我正在编写一个排序算法,它需要一个比较函数,similar to std::sort
:
template <class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp);
在我看来,模板参数 Compare
与 Compare
named requirement 完全匹配。我试图了解如何使用 C++ 20 概念指定该约束,例如 std::strict_weak_order
和 std::equivalence_relation
,但我有点困惑。
如果我引用the article on cppreference,
The type T
satisfies Compare if
The type T
satisfies BinaryPredicate, and Given
comp, an object of type T
equiv(a, b)
, an expression equivalent to !comp(a, b) && !comp(b, a)
std::strict_weak_ordering
可以捕获上面描述中我对 comp
的限制,但是 equiv
呢? std::equivalence_relation
将关系作为第一个模板参数。我的排序功能会是什么?
在 C++ 中,命名要求的功能比概念和约束更广泛。
例如,我可以有一个命名要求,要求某些算法停止。另一方面,没有办法做出一个需要算法暂停的概念。
概念可以检查一些东西,但不能检查所有的东西。因此,命名需求 Compare 首先表示该事物必须是 BinaryPredicate。 BinaryPredicate 可以描述为一个概念并作为约束提供。
正在确认
if comp(a,b)==true then comp(b,a)==false
将需要添加 C++ 的证明子系统并将正式证明与 comp 一起传递,或者检查您传递给 comp
的类型的每个值。
在某些语言中,您可以传递属性的形式证明,并检查这些形式证明以验证函数参数。 C++ 不是其中之一。
Rice 的定理表明您无法获取代码并验证其重要的属性。要实现与您想要的类似的东西,代码必须增加您对它的声明的证明。然后约束可能需要这些额外信息。使用 Turing tar 坑,您甚至可以使用此功能增强 C++,但之后它看起来不太像 C++(这是来自我,我喜欢将命名运算符添加到 C++ 中以获得乐趣)。
TL;DR 并非所有命名需求都可以表示为概念。概念可以检查一些事情,但不能检查所有事情。记录超出概念约束参数的附加要求是 C++ 中的一件事。
我正在编写一个排序算法,它需要一个比较函数,similar to std::sort
:
template <class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp);
在我看来,模板参数 Compare
与 Compare
named requirement 完全匹配。我试图了解如何使用 C++ 20 概念指定该约束,例如 std::strict_weak_order
和 std::equivalence_relation
,但我有点困惑。
如果我引用the article on cppreference,
The type
T
satisfies Compare if The typeT
satisfies BinaryPredicate, and Given
comp, an object of typeT
equiv(a, b)
, an expression equivalent to!comp(a, b) && !comp(b, a)
std::strict_weak_ordering
可以捕获上面描述中我对 comp
的限制,但是 equiv
呢? std::equivalence_relation
将关系作为第一个模板参数。我的排序功能会是什么?
在 C++ 中,命名要求的功能比概念和约束更广泛。
例如,我可以有一个命名要求,要求某些算法停止。另一方面,没有办法做出一个需要算法暂停的概念。
概念可以检查一些东西,但不能检查所有的东西。因此,命名需求 Compare 首先表示该事物必须是 BinaryPredicate。 BinaryPredicate 可以描述为一个概念并作为约束提供。
正在确认
if comp(a,b)==true then comp(b,a)==false
将需要添加 C++ 的证明子系统并将正式证明与 comp 一起传递,或者检查您传递给 comp
的类型的每个值。
在某些语言中,您可以传递属性的形式证明,并检查这些形式证明以验证函数参数。 C++ 不是其中之一。
Rice 的定理表明您无法获取代码并验证其重要的属性。要实现与您想要的类似的东西,代码必须增加您对它的声明的证明。然后约束可能需要这些额外信息。使用 Turing tar 坑,您甚至可以使用此功能增强 C++,但之后它看起来不太像 C++(这是来自我,我喜欢将命名运算符添加到 C++ 中以获得乐趣)。
TL;DR 并非所有命名需求都可以表示为概念。概念可以检查一些事情,但不能检查所有事情。记录超出概念约束参数的附加要求是 C++ 中的一件事。