C++ - 在传递给 std::function 时指定重载的函子或函数
C++ - Specify Overloaded Functor or Function When Passing To `std::function`
所以我想将数学函子传递给 std::function
s.
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++ 中的语法问题:没有构造函数名称将模板参数放在后面)。
所以我想将数学函子传递给 std::function
s.
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++ 中的语法问题:没有构造函数名称将模板参数放在后面)。