【问题标题】:Passing a function as argument through two functions that is a public member of a class通过作为类的公共成员的两个函数将函数作为参数传递
【发布时间】:2020-01-01 05:03:36
【问题描述】:

我有一个公共成员函数,它需要作为参数传递给一个函数,该函数低于我需要从中启动计算的函数。此外,需要传递的函数还需要参数。我正在使用 c++,这是我的第一个大型编码项目,但无法诊断编译错误。

请注意,我试图避免使用指针,这不是我的选择,而是(编辑)我的老板,因此一切都是参考。


-----------------------------------------------------------------
class Class1 {
    public:
        void get_val(int &a, double &val) ;
    private:
        vector<double> vector_ ;
} ; 
  void Class1::get_val(int &a, double &val) { vector_[a] = val;}
-----------------------------------------------------------------
class Class2 {
    public:
        void calc_func(int &b, 
                       std::function< void ( int, double) > functocall, 
                       double &ans)
    private:
        int conversion_ ;
        void calc_other_func(int &c, 
                             std::function< void ( int, double) > functocall, 
                             double &ans)
} ; 

void Class2::calc_func(int &b, 
                       std::function< void ( int, double) > functocall, 
                       double &ans)
 { 
     int c = b * 2 ;
     double tmp_val ;
     calc_other_func(c,functocall, tmp_val) ;
     ans = tmp_val / 4 ;
 }

void Class2::calc_other_func(int &c, 
                             std::function< void ( int, double) > functocall, 
                             double &ans) 
{
    int d;
    double val;
    d = c / conversion_ ;
    functocall(d, val) ;
    ans = val;
}
-----------------------------------------------------------------
int main()
{
    int b = 4;
    double ans;
    Class2.calc_func(b,Class1.get_val(int, double),ans) ;
}
-----------------------------------------------------------------

我得到的编译错误是:

"在成员函数 void Class2::calc_func(int&, double&): 错误:“int”之前的预期主表达式 Class1.get_val(int,double),"

【问题讨论】:

  • 让 Class2 的一个实例调用成员函数 calc_func 。否则将 calc_func 声明为静态函数。
  • 顺便说一句:Class1::get_val() 有参数int&amp;, double&amp;functocall 需要签名int, double。这是一个区别 -> 引用与值。
  • 首先看起来你使用过 Java 或其他类似语言,在 C++ 中访问类函数时使用 :: 而不是 .。其次,在传递函数时,您不需要指定它的参数或参数类型。第三,您可能需要使用std::bind 将函数绑定到特定实例,当然如果它不是静态的。如果您提供了最少的可重现示例(即不要删除类声明),那将会很有帮助。
  • @Scheff 所以我尝试更改签名,但收到以下错误“错误:不匹配调用 '(std::function) (int&, const int&, double&)'"
  • @sklott 我没有使用 Java 的经验,只有 Python 和 Fortran90。我根据您的要求编辑了示例以添加更多详细信息。

标签: c++ functional-programming


【解决方案1】:

首先,就像在 Python 中一样,您需要在调用实例方法时实例化对象,而不是类(C++ 术语中的static)方法。

在用你的代码修复了一些语法问题后,我尝试使用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_val 的引用,但看起来像这样的旧模板会随着时间的推移而被弃用,所以我不会使用它们...

【讨论】:

    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多