【问题标题】:How can i pass function as argument to function in C++ [duplicate]我如何将函数作为参数传递给 C++ 中的函数 [重复]
【发布时间】:2019-11-26 22:10:04
【问题描述】:

我有方法(void DE(...),它根据一些数据点找到函数y=f(x, a, b...) 的参数。当我想使用具有其他数量参数的函数时,我需要注释第一个函数,编写第二个函数,添加(X.PAR[i][1],..., X.PAR[i][n]) 每次我使用func(y, x, param_1....param_n) 时这个函数的参数。我怎样才能让函数f(double x1, x2,...xn) 成为函数DE 的参数,所以我不需要为每个其他函数更改我的程序?

double f(double x1, x2,...xn){

}
void DE(int n){
 double A[n];
 fill(A) //some function that makes up values
 cout<<f(A[0], A[1],...A[n-1]);//if I change number of arguments in f, I also need to change it here
}

【问题讨论】:

  • 那些#defines 会给你带来麻烦。它们是简单的文本替换宏,如果进行替换是否有意义,它们不会给出 。如果您要使用宏,请使用易于区分且难以意外重用的标识符。
  • 除了可变参数,看看variadic templates。尽管在这种情况下,您似乎想传入 ` std::vector` 的值。
  • 替换了那些“定义”
  • 鉴于这个问题,这似乎是很多代码。您能否精简代码以帮助人们专注于与您的问题相关的内容? (请记住,您的示例代码不必计算任何对您的实际项目有用的东西;它只需要演示编码问题。虚拟占位符函数可能是个好主意。)

标签: c++ function arguments


【解决方案1】:

好的,有些事情:

  1. double A[n]; 可变长度数组不是标准的 c++,如果你真的非常想使用 c-array,你必须以另一种方式来做(常数大小,新)。
  2. 但是,你并不真正想要 c-array,你只需要一个 vector,它会带走你所有的问题。
  3. 如果您的需求比您的示例更复杂,并且您确定要使用此方法,则可以传递要在您的方法中调用的函数。

这是第二点解决方案的示例,以及在第 3 点接近解决方案的提示:

#include <iostream>
#include <vector>
using namespace std;

void fill(vector<double> &vec)
{
    vec.push_back(12);
    vec.push_back(1.3);
    vec.push_back(4.7);
}

double f(const vector<double> &vec)
{
    double some_value = 1;
    for(double val:vec)
        some_value = some_value*val;
    return some_value;
}

double fn(double a1, double a2, double an)
{
    double some_value = 1;
    some_value = some_value*a1*a2*an;
    return some_value;
}
void DE()
{
   vector<double> A;
   fill(A); //some function that makes up values
   cout<<f(A)<<endl;
}
template<typename Func>
void DE2(Func func)
{
   double A[3];
   A[0] = 12;
   A[1] = 1.5;
   A[2] = 4.6;
   cout<<func(A[0], A[1], A[2])<<endl;
}

int main()
{
    DE();
    DE2(fn);
}

【讨论】:

  • 感谢您的回答。它适用于具有相同数量参数的不同函数。我想要这样的东西,但我得到“参数太多/很少”错误void DE2(Func func, int n) { double A[n]; fill(A[n], n); switch(n){ case '2': cout&lt;&lt;func(A[0], A[1])&lt;&lt;endl; break; case '3': cout&lt;&lt;func(A[0], A[1], A[2])&lt;&lt;endl; break; } }
  • 好吧,您是否定义了接受不同数量参数的func?而且,您仍然需要更改 double A[n]; 声明
  • 我有几个函数,它们有不同数量的参数,比如func2(a1, a2){} func3(a1, a2, a3){}... 我会尝试异常来避免这个错误。感谢您的帮助,我接受了答案。
  • 无论如何,所有这些疑虑和过度复杂化是更喜欢vector版本的原因,更简单更干净
  • 问题出在具有不同数量参数的函数中。在原始问题中,我有 2D 数组,我像这样表示它struct Arr { double X[NP][D]; }; (具有 D 分量的 NP 向量
猜你喜欢
  • 2020-03-22
  • 2011-04-07
  • 1970-01-01
  • 2015-06-09
  • 2022-01-16
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多