我正在寫一個排序演算法,它需要一個比較函式,類似于std::sort:
template < class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp)。
在我看來,模板引數Compare與Compare命名的要求完全匹配。我試圖理解如何使用C 20的概念來指定該約束,例如std::strict_weak_order和std::equivalence_relation,但我略感困惑。
如果我參考關于cppreference的文章,
型別
的表達。T滿足Compare如果 型別T滿足BinaryPredicate,并且鑒于
comp,一個型別為T的物件equiv(a, b),一個等同于!comp(a, b) && !comp(b, a)
std::strict_weak_ordering可以在上面的描述中捕捉我對comp的約束,但是equiv呢?std::equivalence_relation需要一個關系作為第一個模板引數。在我的排序函式中,它將是什么?
uj5u.com熱心網友回復:
在C 中,命名的要求在能力上比概念和約束更廣泛。
例如,我可以有一個命名需求,即某些演算法會停止。 另一方面,我們沒有辦法制定一個要求演算法停止的概念。
概念可以檢查一些東西,但它們不能檢查所有東西。 所以命名的需求比較說,首先,該事物必須是一個二元論(BinaryPredicate)。BinaryPredicate 可以被描述為一個概念,并作為一個約束條件提供。
確認
if comp(a。 b)==true那么comp(b,a)==false。
這需要添加一個C 的證明子系統,并將形式上的證明與comp一起傳入,或者檢查你傳給comp的每個型別的值。
在有些語言中,你可以傳遞屬性的形式化證明,并且這些形式化證明被檢查以驗證函式引數。 C 不是其中之一。
Rice定理指出,你不能拿著代碼去驗證它的非瑣碎屬性。 為了實作類似于你想要的東西,必須用你對它的主張的證明來增強代碼。 然后,這些額外的資訊可以由約束條件來要求。 使用圖靈焦油坑,你甚至可以用這種能力來增強C ,但之后它看起來就不像C 了(這來自于我,我喜歡在C 中添加命名的運算子來取樂)。
TL;DR 并非所有的命名需求都能被表達為概念。 概念可以檢查一些東西,但不是全部。 在C 中,記錄超出概念約束引數的額外需求是一件事。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/306750.html
標籤:
