我想创建一个函数,它执行一组数据上通过参数传递的函数。如何在C中传递函数作为参数?
当前回答
你需要传递一个函数指针。语法有点麻烦,但是一旦你熟悉了它,它真的很强大。
其他回答
从c++ 11开始,你可以使用函数库以一种简洁和通用的方式来做到这一点。语法是,例如,
std::function<bool (int)>
这里的bool是一个单参数函数的返回类型,该函数的第一个参数是int类型。
下面是一个示例程序:
// g++ test.cpp --std=c++11
#include <functional>
double Combiner(double a, double b, std::function<double (double,double)> func){
return func(a,b);
}
double Add(double a, double b){
return a+b;
}
double Mult(double a, double b){
return a*b;
}
int main(){
Combiner(12,13,Add);
Combiner(12,13,Mult);
}
不过,有时候使用模板函数会更方便:
// g++ test.cpp --std=c++11
template<class T>
double Combiner(double a, double b, T func){
return func(a,b);
}
double Add(double a, double b){
return a+b;
}
double Mult(double a, double b){
return a*b;
}
int main(){
Combiner(12,13,Add);
Combiner(12,13,Mult);
}
这个问题已经有了定义函数指针的答案,但是它们可能会变得非常混乱,特别是如果你要在应用程序中传递它们。为了避免这种不愉快,我建议您将函数指针的类型定义为更可读的类型。为例。
typedef void (*functiontype)();
声明一个返回void且不接受参数的函数。要创建指向该类型的函数指针,您现在可以执行以下操作:
void dosomething() { }
functiontype func = &dosomething;
func();
对于返回int型并接受char型的函数,您可以这样做
typedef int (*functiontype2)(char);
然后使用它
int dosomethingwithchar(char a) { return 1; }
functiontype2 func2 = &dosomethingwithchar
int result = func2('a');
有一些库可以帮助您将函数指针转换为良好的可读类型。boost函数库是伟大的,是非常值得的努力!
boost::function<int (char a)> functiontype2;
比上面的好多了。
函数可以作为函数指针“传递”,根据ISO C11 6.7.6.3p8:“将形参声明为“函数返回类型”应调整为“指向函数返回类型的指针”,如6.3.2.1。”。例如,这个:
void foo(int bar(int, int));
等价于:
void foo(int (*bar)(int, int));
你需要传递一个函数指针。语法有点麻烦,但是一旦你熟悉了它,它真的很强大。
我将用一个简单的示例代码来解释,该代码将比较函数作为另一个排序函数的参数。 假设我有一个冒泡排序函数,它接受一个自定义比较函数,并使用它来代替固定的if语句。
比较函数
bool compare(int a, int b) {
return a > b;
}
现在,冒泡排序以另一个函数作为参数来执行比较
冒泡排序函数
void bubble_sort(int arr[], int n, bool (&cmp)(int a, int b)) {
for (int i = 0;i < n - 1;i++) {
for (int j = 0;j < (n - 1 - i);j++) {
if (cmp(arr[j], arr[j + 1])) {
swap(arr[j], arr[j + 1]);
}
}
}
}
最后,main通过传递布尔比较函数作为参数来调用冒泡排序函数。
int main()
{
int i, n = 10, key = 11;
int arr[10] = { 20, 22, 18, 8, 12, 3, 6, 12, 11, 15 };
bubble_sort(arr, n, compare);
cout<<"Sorted Order"<<endl;
for (int i = 0;i < n;i++) {
cout << arr[i] << " ";
}
}
输出:
Sorted Order
3 6 8 11 12 12 15 18 20 22
推荐文章
- 在Swift中如何调用GCD主线程上的参数方法?
- 在内存的哪里我的变量存储在C?
- 通过SSH使用Eclipse完成远程项目
- int的最大值
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- 函数应该返回空对象还是空对象?
- 在c#中引用类型变量的“ref”的用途是什么?
- 如何以及为什么'a'['toUpperCase']()在JavaScript工作?
- C“int”的大小是2字节还是4字节?
- 如何从Python函数中返回两个值?
- 多维数组如何在内存中格式化?
- printf()和puts()在C语言中的区别是什么?
- 断言是邪恶的吗?
- 有效,但毫无价值的语法在开关情况下?
- 错误:无法找到函数…在R