gpt4 book ai didi

C++ - 在传递到 `std::function` 时指定重载的仿函数或函数

转载 作者:行者123 更新时间:2023-12-02 09:51:59 27 4
gpt4 key购买 nike

所以我想将数学仿函数传递给 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 风格的类型转换,以避免意外执行 reinterpret_cast .
这里没有需要注意的特殊模板参数语法。 std::sqrt不是模板,因此尝试指定模板参数(如 std::sqrt<double> )是不正确的。您也不能显式指定 std::function 的模板参数。构造函数(这是 C++ 中的一个句法问题:没有构造函数名称可以将模板参数放在后面)。

关于C++ - 在传递到 `std::function` 时指定重载的仿函数或函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63892755/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com