Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 设置std::function变量以引用std::sin函数_C++_C++11_Function Pointers_Std_C++ Standard Library - Fatal编程技术网

C++ 设置std::function变量以引用std::sin函数

C++ 设置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

我有一个关于如何正确使用新的C++11
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;