[英]How to pass a void function as a parameter c++?
我正在尝试将 function 作为参数传递。 在这里,我创建了一个sortingRunTime()
,它接受一个数组和一个 function 作为参数并打印出执行时间。
void sortingRunTime(int* arr, void(*functiontocall)(int* arr))
{
clock_t t = clock();
(*functiontocall)(arr);
t = clock() - t;
cout << (t / (float)CLOCKS_PER_SEC);
}
我还有另一个 function void bubblesort(int* arr)
,它对数组进行排序并且不返回任何内容。 此外,我还有其他类型为 void 的排序函数,我必须对所有排序函数使用sortingRunTime()
。 在主要的 function 中,我有
sortingRunTime(arr, bubblesort(arr));
但它给出了错误消息““void”类型的参数与“void (*)(int *arr)”类型的参数不兼容”。 我该如何解决?
您需要传递 function 本身而不是 function 调用的结果。
所以而不是
sortingRunTime(arr, bubblesort(arr));
实际上对调用进行评估
sortingRunTime(arr, void);
这是不正确的,没有意义你需要写
sortingRunTime(arr, bubblesort);
在 function 排序运行时间中,调用sortingRunTime
更简单
functiontocall(arr);
注意这些 function 声明
void sortingRunTime(int*, void(*functiontocall)(int* ));
和
void sortingRunTime(int*, void functiontocall(int * ) );
是等效的并声明相同的 function。
为了在这些电话之间有所区别
sortingRunTime(arr, bubblesort(arr));
和
sortingRunTime(arr, bubblesort);
更明显考虑以下演示程序。
#include <iostream>
#include <iomanip>
#include <type_traits>
void bubblesort( int * );
int main()
{
int a[10];
std::cout << std::boolalpha
<< std::is_same<void, decltype( bubblesort( a ) )>::value
<< '\n';
std::cout << std::boolalpha
<< std::is_same<void( int * ), decltype( bubblesort )>::value
<< '\n';
return 0;
}
程序 output 是
true
true
可以看出,表达式bubblesort( a )
的类型是void
,而表达式bubblesort
的类型是function 类型void( int * )
。 用作 function 参数的此表达式(函数指示符)被隐式转换为指向void ( * )( int * )
类型的 function 的指针。
如果您调用返回 void 的 function,则 function 调用的结果为 void,并且您不能将该 void 作为参数传递给sortingRunTime
。
sortingRunTime
需要一个(指向)function 作为参数的(指针)。 因此,与其传递 function 调用的结果,不如传递(指向)function 本身的结果:
sortingRunTime(arr, &bubblesort);
由于 function 隐式转换为指向自身的指针,因此 addressof 运算符的使用是可选的。 没有它,它的工作原理相同:
sortingRunTime(arr, bubblesort);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.