【问题标题】:How to pass an expression as an argument/parameter?如何将表达式作为参数/参数传递?
【发布时间】:2013-02-07 03:28:08
【问题描述】:

假设我有一个多项式函数 f(x),我想将这个表达式用于表达式 g(x) 或 h(x),具体取决于用户选择。这可能吗?

例如

int main() {

   float fexpression = /* polynomial function f(x) here */;    

   /* some code where user picks g(x) or h(x) */

   if (/* gexpression == true */)
        cout << gfunction(fexpression);
   else /* h expression == true */
        cout << hfunction(fexpression);

return 0;
    }

 float gfunction(float j){

     float var = /* some function representing g(f(x)) == g(j) */;
  return var;
  }

 float hfunction(float j){
       float var = /* some function representing h(f(x)) == h(j) */;
  return var;
      }

在我看来,我可以传递一个表达式变量,例如

float fexpression = ....

【问题讨论】:

  • 不清楚你在哪里设置/使用xfexpression 是字符串吗?你如何评估 f(x)?
  • 我希望它是一个带有变量的多项式表达式。例如,(5*(pow(x,4))) + (3*(pow(x, 3))) + (10 * x) - 5
  • 大概是在赋值过程中求值,所以你实际上传递的是值而不是表达式。这确实需要您在某处定义x...
  • 提示:fexpressionfloat 的事实告诉您,当您调用函数时,它不再是表达式...
  • 嗯...是的,我只是将它设置为浮点数只是因为。但是我不能先计算表达式,因为后面有动态变量插入到表达式中。

标签: c++ function parameters arguments expression


【解决方案1】:

你想要function pointer

使表达式成为函数。

float fexpression( float x )
{
   return (5*(pow(x,4))) + (3*(pow(x, 3))) + (10 * x) - 5
}

正如您编写的那样,这段代码将传递功能本身。

   if (/* gexpression == true */)
        cout << gfunction(fexpression);
   else /* h expression == true */
        cout << hfunction(fexpression);

【讨论】:

  • 是否可以将函数 fexpression 分配给稍后将传递的变量而无需先启动 x?并在传递带有 fexpression 的变量后分配 x 的值?
【解决方案2】:

我试图在 Drew 的回答的评论部分解释这个细节,但它在格式中丢失了......所以不得不开始另一个答案。

@DrewDorman 说得对,您只需将表达式定义为函数:

float fexpression( float x )
{
   return (5*(pow(x,4))) + (3*(pow(x, 3))) + (10 * x) - 5
}

(对您而言)缺少的是以下内容(您可以通过阅读 Drew 的链接...):

如下定义您的gfunction(例如)

float gfunction(float (*funcp)(float)) {
    // lots of stuff to determine the value of x
    return (*funcp)(x);
}

这就是 gfunction 如何评估您的多项式。为hfunction做类似的事情

调用gfunction的时候,要引用fexpression,如下:

cout << gfunction(&fexpression);

&amp; 很重要...... Drew 的回答中也缺少它。

【讨论】:

  • @DrewDormann - 干杯。这种来来回回才是 SO 最有价值的方式。
  • @Floris 在参数中包含 (*funcp)(float) 到底有什么作用?我阅读了指针,但我仍然不清楚。是否将第二个浮点参数转换为名为 funcp 的指针?
  • 这不是演员表 - 这是一个声明。它告诉编译器:“当你解释堆栈上的参数时,当我调用这个函数时,第一个参数是一个指向函数的指针”。 “我要告诉你在哪里可以找到你将要使用的功能”。与“int”、“double”等指示编译器如何解释其他参数的方式相同。函数指针是其中最棘手的一个……但是一旦你意识到编译器只是将函数视为“下一组指令——它们在哪里”,它就更容易接受了。也许吧。
猜你喜欢
  • 1970-01-01
  • 2015-06-09
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
相关资源
最近更新 更多