簡體   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