C++非 void 函数作为函数的参数
C++ a non-void function as an argument to a function
当你有一个函数(指针)作为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 & vec
或const 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
从本质上讲,这允许你做的是获取一个函数指针,向其传递一些参数,并获取一个新的函数指针,它将调用你的原始函数,但使用你指定的参数。
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 当从函数参数中的临时值调用复制构造函数时
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 如何将lambda作为模板类的成员函数参数
- 模板参数推导失败,函数参数/参数不匹配
- 如何在C++中将迭代器作为函数参数传递
- 将函数参数"const char*"转换为"std::string_view"是
- C++ 如何将数组值解压缩为函数参数
- 主函数参数的属性
- 具有两个间接寻址运算符 (C++) 的函数参数的用途
- "Warning: Comma within array index expression"但逗号分隔函数参数
- 如何定义在用作函数参数时工作的类模板的转换
- 将函数参数完美转发到函数指针:按值传递呢?
- 为什么我不能将引用作为 std::async 的函数参数传递
- 什么..(省略号)作为函数原型中唯一的函数参数,C++?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 接受模板作为函数参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- Arduino 函数参数