【问题标题】:C++ a non-void function as an argument to a functionC++ 一个非 void 函数作为函数的参数
【发布时间】:2014-04-04 18:27:23
【问题描述】:

当你有一个函数(指针)作为 C++ 中另一个函数的参数时,这个函数(即参数中的)是否必须是一个 void 函数?

例如。你能有像

这样的功能吗
void run(int (*method)(int, double, vector), int dimension)

这里的函数方法返回一个 int 而不是 void。我也对向量有困难。应该是&vector吗?

当我在我的 main 中调用它时,我有它:

run(jacobi_method(Vnew, V, vec), dimension);

但它不想工作。 谢谢

【问题讨论】:

  • “不起作用”不是人们可以帮助您解决的错误描述。准确。
  • 你想把函数的结果作为参数,还是函数本身?
  • 您试图用于传递函数指针的语法是错误的!将run(jacobi_method(Vnew, V, vec), dimension); 更改为run(jacobi_method, dimension);
  • 抱歉,我对错误不精确,我实际上看不到它所说的错误是什么,它就是无法编译。谢谢cmets-如果我将其更改为仅运行(jacobi_method,尺寸),那么我可以在什么时候输入函数jacobi_method所需的参数? Luchian 我希望函数 jacobi_method 在调用该方法时在 void 中执行。
  • 您在此处进行的调用实际上是使用您传递的参数调用 jacobi_method,然后尝试将整数结果传递给“运行”。所以,如果 run 就像 void run(int r, int dimension),这会起作用,但我认为这不是你想要的

标签: c++ function parameters void-pointers


【解决方案1】:
run(jacobi_method(Vnew, V, vec), dimension);

应该是

run(jacobi_method, dimension);

【讨论】:

  • 感谢您的帮助,如果我更改此设置,我应该在什么时候将参数输入到 jacobi_method?
  • @user3343772 当你通过指针调用你的函数时?你有没有掌握函数指针的概念?
【解决方案2】:

当你有一个函数(指针)作为 C++ 中另一个函数的参数时,这个函数(即参数中的)是否必须是一个 void 函数?

不,它可以是任何类型的函数;只要使用它的代码正确调用它。

应该是 &vector 吗?

你的意思是,它应该是一个参考吗?只有你可以决定。该功能应该修改它吗?那么它应该是一个参考。如果不是,则通过 const 引用而不是值传递可能更有效。

run(jacobi_method(Vnew, V, vec), dimension);

这是试图传递调用函数的结果,而不是指向函数的指针。你想要的

run(jacobi_method, dimension);

【讨论】:

    【解决方案3】:

    例如。你能有这样的功能吗

    void run(int (*method)(int, double, vector), int dimension)

    是的,没关系,只要记住vector是一个模板,所以它应该是

    void run(int (*method)(int, double, vector<some_type>), int dimension)
    

    至于你的来电,

    运行(jacobi_method(Vnew, V, vec), 维度);

    您不能将参数传递给函数指针。你应该把它称为

    run(jacobi_method, dimension);
    

    这是一个完整的工作代码:

        #include <vector>
        #include <iostream>
    
        using namespace std;
    
        int jacobi_method(int a, double b, vector<int> c)
        {
            cout << "jacobi_method: " << a << " " << b << endl;
            for(int i=0; i<c.size(); i++)
                cout << c[i] << endl;
            return 8;
        }
    
        void run(int (*method)(int, double, vector<int>), int dimension)
        {
            int result;
            vector<int> a;
            a.push_back(1337);
            a.push_back(1338);
            result = method(dimension,2.1,a);
            cout << "Result = " << result << endl;
        }
    
        int main()
        {
            run(jacobi_method, 2);
            return 0;
        }
    

    【讨论】:

    • 谢谢,看起来很有帮助,我会试试的。
    • 我已经试过了,现在它一直说没有匹配的函数可以运行,虽然我已经检查过 run 的定义在任何地方都是一样的!
    • 真的吗?你跑的和我写的完全一样吗?它在这里工作正常。你能粘贴错误信息吗?
    • 它是“没有要运行的匹配函数”,我的版本略有不同,因为我使用了你用我的代码编写的内容,尽管我确信我已经做了和你一样的事情以上。
    • 也许您定义的方法相同,但是您使用错误类型的参数调用它。例如:您使用 vector 定义,但使用 vector 进行调用。请按原样运行我的代码,看看是否仍然出现错误。
    【解决方案4】:

    是的,可以将非 void 返回函数作为参数传递。 完整示例:

    #include <iostream>
    
    using namespace std;
    
    int sum(int a, int b) {
        return a + b;
    }
    
    int substract(int a, int b) {
        return a - b;
    }
    
    void run(int (*f)(int a, int b), int a, int b) {
        int res = f(a, b);
        cout << "Result: " << res << endl;
    }
    
    int main()
    {
        run(sum, 10, 5);
        run(substract, 10, 5);
    
        return 0;
    }
    

    【讨论】:

    • 啊,谢谢你,我会试试的,所以在这里: void run(int (*f)(int a, int b), int a, int b) { int res = f(a, b) ; cout
    • 是的,可能会发生混淆,所以我解释一下: int (*f)(int a, int b) :参数是函数的指针,它接受 int 参数并返回一个 int 值int a : 表示函数 run 的第一个 int 参数 int b : 表示函数 run 之后的第二个 int 参数,在函数 run() 中: int res = f(a, b); meens : 用run函数的两个int参数值调用函数f(函数上的指针)
    【解决方案5】:

    这样的定义是合法的

    void run(int (*method)(int, double, vector), int dimension)
    

    但是,

    run(jacobi_method(Vnew, V, vec), dimension);
    

    等价于

    int r = jacobi_method(Vnew, V, vec);
    run(r, dimension);
    

    所以你应该打电话:

    run(jacobi_method, dimension);
    

    关于向量问题,推荐通过引用传递(Vector &amp; vecconst Vector &amp; vec只读),因为传值传递(Vector vec)实际上是make a copy,在大多数情况下会导致效率低下。

    因此,仅当您倾向于make a copy 时才按值传递向量。相同的规则可以应用于任何其他参数传递,例如其他容器和用户定义的对象

    【讨论】:

      【解决方案6】:

      是的,您可以拥有一个函数,该函数接受指向具有特定签名的另一个函数的指针:

      void run(int (*method)(int, double, std::vector<int>), int dimension)
      {
           std::vector<int> vec;   
           // put some values in the vector here
           int result = method(1, 2.5, vec);   // this will call the function
      }
      

      以及调用:

      int my_method(int x, double d, std::vector<int> v)
      {
         int result;
         // function code here
         return result;
      }
      
      run(my_method, dimension);
      

      但是,如果您想将带有特定参数的函数传递给“run”,并且还能够在“run”中更改这些原始参数,那么您需要传入一个包装方法及其参数的函子,因此,您的“运行”将根据原始参数和/或“运行”自身所做的任何更改获得结果。

      让我知道这是否是你真正想要的。

      【讨论】:

        【解决方案7】:

        其他发帖人指出了你的语法错误,我会回答你的另一个问题:你如何为有问题的函数指定参数。

        如果您想在构造函数指针时指定它们(如您原来的帖子中所示),您的函数类型实际上应该是int (*method)()。您不希望任何人能够通过指针更改函数参数,这就是为什么您的指针实际上指向不接受参数的函数的原因。 如果你想重用你已经拥有的一些函数,并分配一些参数,并将函数作为指针传递给你分配的参数,你需要的是std::bind。关于它的一些文档:http://en.cppreference.com/w/cpp/utility/functional/bind

        本质上,这允许您做的是获取一个函数指针,将一些参数传递给它,并获取一个新的函数指针,它将调用您的原始函数,但使用您指定的参数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-30
          • 1970-01-01
          • 2021-11-19
          • 1970-01-01
          • 2012-02-03
          • 2014-07-11
          • 2013-07-10
          • 2016-09-23
          相关资源
          最近更新 更多