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++中如何将子线程的参数传回主线程

从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?

C++ 将列表作为参数传递给函数

如何将 lambda 表达式作为参数传递给 c++ 模板

我们如何在 C++ 中将二维数组/向量作为函数参数传递? [复制]

C++ CreateThread函数如何传递this指针作为参数