簡體   English   中英

如何為啟發式 function 編寫 c++ 概念

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM