C++ 将数学表达式传递给函数

C++ 将数学表达式传递给函数,c++,function,math,C++,Function,Math,我需要在C++中生成函数来计算积分。我正在使用simpsone规则计算给定积分的值。我知道怎么计算。我在数学方面没有任何问题。我需要知道如何传递整个表达式以使程序灵活 我有4个f(x)函数需要计算。例如: f(x)=2e^x f(x)=x^3e etc. 我有两个选择 1) 我可以为每个f(x)函数执行单独的函数 double function1() { ... calculations 2e^x ... return resault; } double function2() { ...

我需要在
C++
中生成函数来计算积分。我正在使用
simpsone规则
计算给定积分的值。我知道怎么计算。我在数学方面没有任何问题。我需要知道如何传递整个表达式以使程序灵活

我有4个
f(x)
函数需要计算。例如:

f(x)=2e^x
f(x)=x^3e
etc.
我有两个选择

1) 我可以为每个
f(x)
函数执行单独的函数

double function1() {
...
calculations 2e^x
...
return resault;
}

double function2() {
...
calculations x^3e
...
return resault;
}
这种方法编写起来既简单又快速,但代码一点也不灵活。在这种情况下,我需要为每个新给定的f(x)函数生成新函数

double function1() {
...
calculations 2e^x
...
return resault;
}

double function2() {
...
calculations x^3e
...
return resault;
}
我想有一个函数,我可以将所选的
f(x)
函数传递给它

double function1() {
...
calculations 2e^x
...
return resault;
}

double function2() {
...
calculations x^3e
...
return resault;
}
2) 我喜欢的第二种情况是对表达式进行某种解释。我考虑将表达式的各个部分放入
std::vector
中,然后对
vector
的每个单元格进行计算

我已经看到了将字符串解析为表达式的想法,但我认为最终它将与
vector
的想法几乎相同。我可能错了


让我的代码灵活且易于用户(而非程序员)使用的最佳方法是什么?

假设您有一个函数,它接受两个表达式并返回它们的结果之和。您可以使用
lambda expression
将表达式传递给函数,这是自
C++11
以来所支持的,如下所示:

template<typename Func, typename Func2>
int calculate(Func &lambda_expr1, int param1, Func2 &lambda_expr2, int param2)
{
    return lambda_expr1(param1) + lambda_expr2(param2);
}

void main()
{
    // case 1
    auto f1 = [](int p) {return p*p; }; // expression 1
    auto f2 = [](int p) {return p*p*p; }; // expression 2
    int result = calculate(f1, 3, f2, 4);
    // result = 73

    // case 2
    result = calculate([](int p) {return p*p/2; }, 4, [](int p) {return p*p*p/3; }, 3);
    // result = 17
}
模板
int计算(Func&lambda_expr1、int参数1、Func2&lambda_expr2、int参数2)
{
返回lambda_expr1(参数1)+lambda_expr2(参数2);
}
void main()
{
//案例1
auto f1=[](int p){return p*p;};//表达式1
auto f2=[](int p){return p*p*p;};//表达式2
int结果=计算(f1,3,f2,4);
//结果=73
//案例2
结果=计算([](int p){return p*p/2;},4,[](int p){return p*p*p/3;},3);
//结果=17
}

你真正的问题是:“如何为数学函数构建解析器?”不是吗?这可能是你想要的。是的,这并不容易。辛普森的规则是一样的,将被集成的函数本质上视为一个黑匣子——它不需要任何能力在运行中更改或重新解释该函数。为什么您认为实现辛普森规则的代码需要能够更改或重新解释它集成的函数?比如说,与知道传递给它的是一个接受实数参数并返回实数结果的函数不同?@Iomanip那么您需要一个表达式解析器。没有标准的C++特性,你必须自己编写或者使用一个提供这个特性的库。这样可以更容易地使用EVE或嵌入的解释程序在解释程序上这样做(例如Lua或Python)。