c++ - 如何将void函数作为参数传递?
Posted
技术标签:
【中文标题】c++ - 如何将void函数作为参数传递?【英文标题】:How to pass a void function as a parameter c++? 【发布时间】:2021-12-29 09:21:42 【问题描述】:我正在尝试将函数作为参数传递。
在这里,我创建了一个函数sortingRunTime()
,它接受一个数组和一个函数作为参数,并打印出执行时间。
void sortingRunTime(int* arr, void(*functiontocall)(int* arr))
clock_t t = clock();
(*functiontocall)(arr);
t = clock() - t;
cout << (t / (float)CLOCKS_PER_SEC);
我有另一个函数void bubblesort(int* arr)
,它对数组进行排序并且不返回任何内容。此外,我还有其他类型为 void 的排序函数,我必须对所有排序函数使用 sortingRunTime()
。在主函数中,我有
sortingRunTime(arr, bubblesort(arr));
但它给出了错误消息““void”类型的参数与“void (*)(int *arr)”类型的参数不兼容”。我该如何解决?
【问题讨论】:
正如所写,您实际上是在调用冒泡排序。你想要做的是像这样传递函数指针:sortingRunTime(arr, bubblesort)
【参考方案1】:
如果调用返回 void 的函数,则函数调用的结果为 void,并且不能将该 void 作为参数传递给 sortingRunTime
。
sortingRunTime
需要一个(指向)函数作为参数。因此,与其传递函数调用的结果,不如传递(指向函数的)函数本身:
sortingRunTime(arr, &bubblesort);
由于函数隐式转换为指向自身的指针,因此 addressof 运算符的使用是可选的。没有它也一样:
sortingRunTime(arr, bubblesort);
【讨论】:
谢谢你的回答!!【参考方案2】:您需要传递函数本身而不是函数调用的结果。
所以不是
sortingRunTime(arr, bubblesort(arr));
实际评估为调用
sortingRunTime(arr, void);
这是不正确的,没有意义你需要写
sortingRunTime(arr, bubblesort);
在函数sortingRunTime
中调用函数更简单
functiontocall(arr);
注意这些函数声明
void sortingRunTime(int*, void(*functiontocall)(int* ));
和
void sortingRunTime(int*, void functiontocall(int * ) );
是等价的并且声明相同的一个函数。
在这些调用之间产生差异
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;
程序输出是
true
true
正如所见,表达式bubblesort( a )
的类型是void
,而表达式bubblesort
的类型是函数类型void( int * )
。这个用作函数参数的表达式(函数指示符)被隐式转换为指向void ( * )( int * )
类型函数的指针。
【讨论】:
谢谢,它成功了。我还在学习如何使用指针,我会注意你提到的提示。以上是关于c++ - 如何将void函数作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章
从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?