C++ - 在传递给 std::function 时指定重载的函子或函数

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

所以我想将数学函子传递给 std::functions.

    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 强制转换为所需的特定函数指针类型)是选择您想要的特定重载的正确方法。正如您所观察到的,它在有和没有显式 & 的情况下都有效。使用 static_cast<double(*)(double)> 比 C-style 转换会被认为是更好的风格,以避免意外执行 reinterpret_cast.

这里没有需要注意的特殊模板参数语法。 std::sqrt 不是模板,因此尝试指定模板参数(如 std::sqrt<double>)是不正确的。您也不能显式指定 std::function 构造函数的模板参数(这是 C++ 中的语法问题:没有构造函数名称将模板参数放在后面)。