C++ 将函数作为参数传递给作为类的公共成员的两个函数

C++ 将函数作为参数传递给作为类的公共成员的两个函数,c++,functional-programming,C++,Functional Programming,我有一个公共成员函数,它需要作为参数传递给一个函数,该函数低于我需要从中启动计算的函数。此外,需要传递的函数还需要参数。我在C++中工作,这是我的第一个大型编码项目,并且我在诊断编译错误方面有困难。 请注意,我试图避免使用指针,这不是我的选择,而是(编辑)我的上司,因此所有内容都是参考的 ----------------------------------------------------------------- 一班{ 公众: 无效获取值(整数和整数、双倍和整数); 私人: 向量u2;;

我有一个公共成员函数,它需要作为参数传递给一个函数,该函数低于我需要从中启动计算的函数。此外,需要传递的函数还需要参数。我在C++中工作,这是我的第一个大型编码项目,并且我在诊断编译错误方面有困难。 请注意,我试图避免使用指针,这不是我的选择,而是(编辑)我的上司,因此所有内容都是参考的


-----------------------------------------------------------------
一班{
公众:
无效获取值(整数和整数、双倍和整数);
私人:
向量u2;;
} ; 
void Class1::get_val(int&a,double&val){vector_[a]=val;}
-----------------------------------------------------------------
二级{
公众:
无效计算函数(内部和外部),
函数函数调用,
双人床(ans)
私人:
整数转换;
无效计算其他功能(内部和外部),
函数函数调用,
双人床(ans)
} ; 
无效类别2::计算函数(内部和外部),
函数函数调用,
双人床(ans)
{ 
int c=b*2;
双tmp_val;
计算其他功能(c、功能调用、tmp值);
ans=tmp_val/4;
}
无效类别2::计算其他功能(内部和外部),
函数函数调用,
双人床(ans)
{
int d;
双val;
d=c/换算系数;
函数调用(d,val);
ans=val;
}
-----------------------------------------------------------------
int main()
{
int b=4;
双ans;
类2.计算函数(b,类1.获取值(int,double),ans);
}
-----------------------------------------------------------------
我得到的编译错误是:

在成员函数void Class2::calc_func(int&,double&)中: 错误:“int”之前应为主表达式
Case1.GETYVALL(int,double),“

,首先,像Python一样,调用实例方法时需要实例化对象,而不是C++类中的类(<代码>静态< /代码>)。 在修复了代码中的一些语法问题后,我尝试使用
std::bind
,但它不起作用,因为它返回的类型与
std::function
不兼容

所以,我认为剩下的唯一简单的方法就是使用lambda,例如:

int main()
{
    int b = 4;
    double ans;
    Class1 c1;
    Class2 c2;
    c2.calc_func(b, [&c1](int i, double d) {c1.get_val(i, d);}, ans);
}
或者您可以传递非成员函数,也可以包装对成员函数的访问,即:

Class1 c1;

void get_c1_val(int i, double d)
{
    c1.get_val(i, d);
}

int main()
{
    int b = 4;
    double ans;
    Class2 c2;
    c2.calc_func(b, get_c1_val, ans);
}

PS:理论上,您可以使用
std::mem\fn
而不是
std::function
,并直接传递对
get\u val
的引用,但看起来像这样的旧模板会随着时间的推移而被弃用,所以我不会使用它们…

让Class2的一个实例调用成员函数
calc\u func
。否则将calc_func声明为静态函数。顺便说一句:
Class1::get_val()
具有参数
int&,double&
,但
functocall
需要签名
int,double
。这是一个不同的例子。引用与Vals.首先,看起来C++中的java或类似的语言,当访问类函数<代码>::< /C> >代替<代码> > <代码>。第二,当传递函数时,不需要指定它的参数或参数类型。第三,您可能需要使用
std::bind
将函数绑定到特定实例,当然,如果它不是静态的。如果您提供了最小的可复制示例(即,不要删除类声明),这将非常有用。@Scheff因此我尝试更改签名,但收到以下错误“错误:调用(std::function)(int&,const int&,double&')”@sklott我没有Java方面的经验,只有Python和Fortran90。我编辑了我的示例,以便根据您的要求添加更多详细信息。