std :: function与标准函数

时间:2019-01-14 13:33:17

标签: c++ std c++17

我在玩功能指针 std :: function 并遇到以下问题。

让我们考虑以下代码:

#include <cmath>
#include <functional>

// g++ -std=c++17 SF.C -o SF
// clang++ -std=c++17 SF.C -o SF

int main()
{
    typedef double (*TpFunctionPointer)(double) ;

    TpFunctionPointer pf1 = sin;                     // o.k.
    TpFunctionPointer pf2 = std::sin;                // o.k
    TpFunctionPointer pf3 = std::riemann_zeta;       // o.k

    std::function< double(double) > sf1( sin );                // o.k
    std::function< double(double) > sf2( std::sin );           // fails
    std::function< double(double) > sf3( std::riemann_zeta );  // fails
}

使用g++ v8.2clang v7.0进行编译对于函数指针pf1,pf2,pf3和sf1都可以正常工作。 但是对于sf2和sf3,我会收到相当长的错误消息,例如:

SF.C:17:47: error: no matching function for call to ‘std::function<double(double)>::function(<unresolved overloaded function type>)’
  std::function< double(double)> sf2( std::sin );           // fails

这是预期的行为吗?
sf2sf3不好吗?

1 个答案:

答案 0 :(得分:5)

multiple overloads of the <cmath> std::sin(有a template version in <complex>,但这不是您想要的),尽管实际上只有一个成功绑定到您的{ {1}}类型!从这种意义上讲,C ++不会向后查找...

…除非是这样! static_cast on a function pointer type是一个例外,这正是您在这里需要的:

std::function

the static_cast cppreference documentation page上有一个示例。

在此一般解决方案上有一些潜在的改进(感谢Nathan和MSalters):

std::function<double(double)> sf2(static_cast<double(*)(double)>(&std::sin));

std::function<double(double)> sf2(static_cast<TpFunctionPointer>(&std::sin))