簡體   English   中英

c ++作為沒有指針的參數

[英]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是不可能的)。

兩種形式都是等同的。 我更喜歡明確顯示參數是指針的表單。 參數是指針的知識很重要,因為您可以將值NULLnullptr0作為參數傳遞。 您的程序將編譯,但如果有人將執行函數調用f(0)則會崩潰。 在調用指針對象之前,您總是希望檢查函數指針是否不是空指針,除非您確定使用NULLnullptr0參數調用函數是不可能的。

如果在項目中使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM