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