簡體   English   中英

C++ - 在傳遞給 `std::function` 時指定重載的函子或函數

[英]C++ - Specify Overloaded Functor or Function When Passing To `std::function`

所以我想將數學函子傳遞給std::function

    std::function< double( double ) > squareRoot( std::sqrt );

我收到一條錯誤消息,說它無法解決 MSVC 和 GCC 上的過載問題。 然而這有效

    std::function< double( double ) > squareRoot( ( double( * )( double ) ) std::sqrt );
    std::cout << squareRoot( 4.0 ) << "\n";

可怕的是,如果我們傳遞函子的地址,它會起作用

    std::function< double( double ) > squareRoot( ( double( * )( double ) ) &std::sqrt );
    std::cout << squareRoot( 4.0 ) << "\n";

后兩個(瑣碎的)程序都會產生有效的輸出。

在將函子傳遞給諸如std::function類的東西時,指定函子的特定重載的正確方法是什么(如果有人可以解釋模板參數語法,特別是與此相關的內容)?

更新 0

以下適用於 GCC 但不適用於 MSVC,因此我正在更新標題以包含函數。

std::function< double( double ) > squareRoot( sqrt );

更新 1

前面的示例在 GCC 和 MSVC 下都有效,只包含<cmath>但在<math.h>之后包含時無效。 我不確定我實際上是在處理函數還是函子。

您完成此操作的方式(將std::sqrt轉換為所需的特定函數指針類型)是挑選所需特定重載的正確方法。 正如您所觀察到的,它在使用和不使用顯式&情況下都可以使用。 為了避免意外執行reinterpret_cast ,使用static_cast<double(*)(double)>比 C 風格的轉換被認為是更好的風格。

這里沒有需要注意的特殊模板參數語法。 std::sqrt不是模板,因此嘗試指定模板參數(如std::sqrt<double> )是不正確的。 您也不能為std::function構造std::function顯式指定模板參數(這是 C++ 中的一個語法問題:沒有構造函數名稱來放置模板參數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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