[英]c++ functions as parameters without pointers
在搜索如何在C ++中將函數作為參數傳遞時,我只找到使用函數指針的示例。 但是,以下內容在Visual Studio中按預期編譯並輸出“g20”。 這樣聲明f更好嗎:
f(void (*fun)());
代替
f(void fun());
我的例子:
#include <iostream>
using namespace std;
int f(void fun());
void g();
int main() {
cout << f(g);
}
void g() {
cout << "g";
}
int f(void fun()) {
fun();
return 20;
}
您可能更喜歡std::function<>
而不是函數指針。 它不僅可以存儲函數指針,還可以存儲lambdas,綁定表達式,函數對象(帶有operator()
對象)等。特別是lambdas將使您的API更好用。
int f(std::function<void()>& fun) {
fun();
return 20;
}
另一種簡單且沒有std:::function
成本的std:::function
是使用模板。
template <typename Function>
int f(Function function) {
function();
return 20;
}
這樣,類型將被推斷為任何類型的可調用對象。 它還應該使編譯器能夠內聯調用(如果可以的話)(使用std::function
是不可能的)。
兩種形式都是等同的。 我更喜歡明確顯示參數是指針的表單。 參數是指針的知識很重要,因為您可以將值NULL
, nullptr
或0
作為參數傳遞。 您的程序將編譯,但如果有人將執行函數調用f(0)
則會崩潰。 在調用指針對象之前,您總是希望檢查函數指針是否不是空指針,除非您確定使用NULL
, nullptr
或0
參數調用函數是不可能的。
如果在項目中使用lambdas,則應使用`templates。 否則你可以繼續使用原始函數指針,但要確保檢查函數指針(如果需要)
template <typename Function>
int f(const Function& functionp) {
if(functionp)
functionp();
return 20;
}
Lambdas和std::function<>
對象也有一個bool
運算符,所以行if(functionp)
也適用於那些。 它將對包含nullptr的std::function<>
對象求值為false
,否則對std::function<>
對象和lambdas求值為true
。
Ampersand &
使其成為引用, std :: decay_t使引用成為指針。
template <class R, class Args...>
using func_ref_t = R(&)(Args...)
template <class R, class Args...>
using func_ptr_t = R(&)(Args...)
根據C(和C ++)標准,當參數具有函數類型時,編譯器會自動將其調整為相應的函數指針類型。 因此,就編譯器而言,兩者是相同的。
C99標准第6.7.5.3節第8段:
參數聲明為''函數返回類型''應調整為''函數返回類型的指針'',如6.3.2.1所述。
C ++ 03標准第8.3.5節第3段:
[...]確定每個參數的類型后,任何類型[...]“函數返回T”的參數分別被調整為“指向函數返回T的指針”。 [...]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.