C++ 设置std::function变量以引用std::sin函数
我有一个关于如何正确使用新的C++11C++ 设置std::function变量以引用std::sin函数,c++,c++11,function-pointers,std,c++-standard-library,C++,C++11,Function Pointers,Std,C++ Standard Library,我有一个关于如何正确使用新的C++11std::function变量的问题。我在网上看到了几个例子,但它们似乎没有涵盖我正在考虑的使用案例。以这个最小的例子为例,函数fdiff是numerical.hxx中定义的有限前向差分算法的一个实现(这不是问题所在,我只是想给出一个上下文原因,为什么我想取任意函数并传递它) #包括 #包括 #包括 #包括“numerical.hxx” int main() { 双启动=0.785398163; 双台阶=0.1; 整数阶=2; 函数f_sin=std::si
std::function
变量的问题。我在网上看到了几个例子,但它们似乎没有涵盖我正在考虑的使用案例。以这个最小的例子为例,函数fdiff
是numerical.hxx
中定义的有限前向差分算法的一个实现(这不是问题所在,我只是想给出一个上下文原因,为什么我想取任意函数并传递它)
#包括
#包括
#包括
#包括“numerical.hxx”
int main()
{
双启动=0.785398163;
双台阶=0.1;
整数阶=2;
函数f_sin=std::sin;
std::cout使用lambda,您将始终处于安全的一面:
std::function<double(double)> f_sin = [](double arg) -> double { return std::sin(arg); };
[更新]此答案是新版本,以前关于使用函数模板专门化的建议不正确,因为std::sin不是函数模板,而是一组重载函数。是一个重载函数:您必须消除对std::sin
重载的歧义。您的意思是:
std::function<double(double)> f_sin = (double(*)(double))&std::sin;
函数f_sin=(double(*)(double))&std::sin;
在某些情况下,编译器可以消除重载函数的歧义(例如,如果
f_sin
的类型为double(*)(double)
,则不需要强制转换)。但是,这不是这些情况之一。我仍然会收到与上面报告的更改相同的错误消息(这是我尝试过的变体之一)。我被OP误导了:“std::sin在标准库中作为模板类实现”
;)@JamesMcNellis当然你的答案是正确的,很抱歉措辞不当。我指的是模板函数,这是基于我在我的计算机(g++4.7.1)上看到的cmath头的第455行。我是否读取的头文件不正确,实际上它不是一个模板函数?@jmert没有问题。附带说明的是,正确的名称是函数模板
而不是模板函数
。对于类模板
,我是不正确的…在C++11中添加了额外的sin
重载…我已经收回了所有inco请更正评论。对此表示抱歉。std::function
提供Sig*
或Sig&
构造函数重载也会有所帮助。谢谢。如果我删除第一组内部括号,使其具有(double(*)(double))&std::sin
。是的,这些括号是无关的,我已经编辑了答案以删除它们。作为后续问题,我想,如果“C++-way”不能解决重载问题,而“C-way”可以解决重载问题,那么std::function
与使用C风格函数指针相比有什么优势?我知道如果我使用double(*func)(double)
在我对fdiff
的定义中,当使用std::sin
作为参数时,我不需要显式强制转换,而显然,如果我使用std::function
定义fdiff
时,我需要强制转换支持任意可调用对象类型(例如,它与调用std::bind
、函子或有状态lambda的结果一起工作)。函数指针不支持这些。
test.cpp: In function ‘int main()’:
test.cpp:11:45: error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type ‘std::function<double(double)>’ requested
std::function<double(double)> f_sin = [](double arg) -> double { return std::sin(arg); };
auto f_sin = [](double arg) -> double { return std::sin(arg); };
std::cout << fdiff(start, step, order, f_sin) << std::endl;
std::function<double(double)> f_sin = (double(*)(double))&std::sin;