将函数用作函数

时间:2016-05-26 06:17:12

标签: c++ function types

我正在尝试创建一个程序,以在两个限制之间数字地集成一个函数。我创建了一个最小的例子(其中“积分”总是1.0)来说明我得到的错误。下面的代码试图使用一个函数,其参数是两个双精度函数和一个从双精度到双精度的函数:

#include <iostream>
#include <math.h>
double cons(double a, double b, double c(double d))
{        
    return 1.0;
}
double f(double x)
{
    return x*x;
}
int main()
{
    double x;
    double I = cons(0, 1, f(x));
    std::cout << I << "";
}

这导致cpp.sh

出错
  

14:31:错误:无法将'double'转换为'double()(double)',将参数'3'转换为'double cons(double,double,double()(double) )'

显然,双精度和双值函数之间的区别在这里引起了一个问题。我怎样才能使这个工作?

3 个答案:

答案 0 :(得分:8)

您需要传递该功能,而不是调用它。

#include <iostream>
#include <math.h>
double cons(double a, double b, double c(double d))
{        
    return 1.0;
}
double f(double x)
{
    return x*x;
}
int main()
{
    double x;
    double I = cons(0, 1, f);
    std::cout << I << "";
}

答案 1 :(得分:1)

你没有传递一个函数,而是一个函数的结果,一个double。其次,你没有正确地将函数指针声明为参数。

如果要传递double,则声明double为参数:

double cons(double a, double b, double c)
{        
    return 1.0*a*b*c;
}
double f(double x)
{
    return x*x;
}
int main()
{
    double x;
    double I = cons(0, 1, f(x));
    std::cout << I << "";
}

如果要传递函数(又名函数指针,因为C ++不是函数式语言):

double cons(double a, double b, double (*c)(double d))
{        
    return 1.0*c(a);
}
double f(double x)
{
    return x*x;
}
int main()
{
    double x;
    double I = cons(0, 1, f);
    std::cout << I << "";
}

答案 2 :(得分:0)

在这种情况下,您的问题是您正在使用以下函数调用该函数:

double I = cons(0, 1, f(x));

所以你实际上给了cons的返回值f()而不是实际的函数。所以你需要写这个保证:

double I = cons(0, 1, f);

作为替代方案,您还可以使用lambda表达式来解决您的问题。例如:

#include <iostream>
#include <math.h>
#include <functional>
double cons(double a, double b, const std::function<double(double)>& callback)
{        
    // do something 
}

int main()
{
    double x;
    double I = cons(0, 1, [](double x){ return x*x});
    std::cout << I << "";
}