繁体   English   中英

如何将 void function 作为参数 c++ 传递?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM