[英]How to write a c++ concept for Heuristic function
我正在用 c++ 20 中的啟發式 function 實現搜索算法。我試圖約束 function 我的算法可以使用如下概念:
template<typename SelfType, unsigned from, unsigned to>
concept Heuristic = requires(SelfType h, unsigned current)
{
{ h(current) } -> unsigned;
assert(h(to) == 0);
};
然后我可以寫如下內容:
template<unsigned from, unsigned to>
struct H
{
unsigned operator()(unsigned current)
{
return to - current + 100;
}
};
當然,斷言不起作用,這不是有效的啟發式方法,因為這里 h(to) 是 100。我想讓編譯器在編譯時檢查 h(to) 等於 0。
我想讓編譯器檢查 h(to) 等於 0 的編譯時間。
這只有在編譯器能夠在編譯時調用h(to)
時才有可能。 它不能,因為不能保證調用的任何 function 都是constexpr
。 SelfType
可以是 function 指針類型,並且 function 指針不攜帶constexpr
。 概念甚至無法檢查某物是否為常量表達式。
當您開始考慮值 map 是否進入正確的域,或者 function 是否將值映射到域時,這不再是一個真正的“概念”。 或者至少,它不是語言特征意義上的概念。
也就是說,當我們認為某些東西是語言無法驗證的概念的特定用戶的要求時。 C++20 概念庫充滿了這些公理化的概念要求。
這也是為什么您應該使用命名成員 function 作為啟發式方法的一個很好的理由,而不是假設任何具有operator()
重載的東西都會發生在從無符號整數到無符號整數的 map 是“啟發式”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.