C++非 void 函数作为函数的参数

C++ a non-void function as an argument to a function

本文关键字:函数 参数 void C++      更新时间:2023-10-16

当你有一个函数(指针)作为c++中另一个函数的参数时,这个函数(在参数中)必须是空函数吗?

例如。你能有一个像这样的功能

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

此处,函数方法返回 int 而不是 void。我在使用矢量方面也有困难。它应该是一个 &向量吗?

当我在我的主目录中调用它时,我将其称为:

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

但它不想工作。 谢谢

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

应该是

run(jacobi_method, dimension);

当你有一个函数(指针)作为 c++ 中另一个函数的参数时,该函数(在参数中)必须是 void 函数吗?

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

它应该是一个 &向量吗?

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

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

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

run(jacobi_method, dimension);

例如。你能有一个像这样的功能

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

)

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

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

至于你的召唤,

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

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

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;
}

是的,可以将非 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 (*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 & vecconst Vector & vec为只读),因为按值(Vector vec)传递实际上make a copy,这将导致在大多数情况下效率低下。

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

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

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"中更改这些原始参数,那么你需要传入一个包装方法及其参数的函子,这样你的"run"将根据原始参数和/或"run"本身所做的任何更改来获得结果。

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

其他海报已经指出了你的语法错误,我将回答你的另一个问题:你如何为所讨论的函数指定参数。

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

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