gpt4 book ai didi

c++ - std::function 与标准函数

转载 作者:太空宇宙 更新时间:2023-11-04 15:57:15 26 4
gpt4 key购买 nike

我在玩函数指针 vs. 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 不应该没问题吗?

最佳答案

multiple overloads of the <cmath> std::sin (有 a template version in <complex> ,但这不是你想要的),编译器不知道你想要哪个,尽管事实上只有一个会成功绑定(bind)到你的 std::function类型!从这个意义上说,C++ 不会向后查找……

…除非它发生了!一个异常(exception)是 static_cast on a function pointer type ,这正是您在这里需要的:

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

the static_cast cppreference documentation page 上有一个这样的例子.

这个通用解决方案的一些潜在改进(感谢 Nathan 和 MSalters):

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

std::function<double(double)> sf2([](double val){ return std::sin(val); });

关于c++ - std::function 与标准函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54182549/

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