簡體   English   中英

奇怪的 function 聲明和 C++ 中的 lambdas

[英]Weird function declaration and lambdas in C++

所以我正在瀏覽一些筆記,我被一些奇怪的聲明弄糊塗了。 在下面的代碼段中,您可以看到下面的代碼塊有一個 function 分配給一個自動變量

#include<iostream>
using namespace std;
void Hi(int a)
{  
    cout << "Hi" << a << endl;
}

int main()
{
    auto Print = Hi;
    Print(5);
}

但是 function (這里是“嗨”)沒有括號(),它仍然有效..那么它是如何工作的? 更讓我心動的是它的類型是什么? 最后,當我們調用該變量時,它會打印“Hi5”。

我對這部分很好奇,因為這只是我們代碼的一個示例部分。 我們需要制作一個 for-each 循環 function 的工作示例,以使用這種類型在向量中顯示值。

我似乎找不到任何線索,因為我什至不知道類型..但是我們的教授確實提到要更好地使用“lambdas”,我在網上查了一下,但我不清楚它是什么. 任何提醒都會非常有幫助。

但是 function (這里是“嗨”)沒有括號(),它仍然有效..那么它是如何工作的?

您在這里觀察到的是function 指針,顧名思義,它通常是指向 function 的指針。 函數畢竟只是 CPU 指令,存儲在二進制可執行文件中的某個位置,這個 function 指針指向 memory 中 function 的地址。 我們實際上是在檢索那些 CPU 指令的位置,其中使用了引用 ( & ),這最終等同於&Hi (有一個隱式轉換,因此寫Hi就足夠了)

更讓我心動的是它的類型是什么?

它的void(*Print)(int)類型,一個 void 類型 function 指針,接受 integer 作為參數。 第一個帶有取消引用*()包含 function 的名稱,在您的示例中為Print (它可以是任何東西,取決於您的自動變量的名稱)第二個()表示傳遞給 function 的參數類型,在您的情況下是 integer 所以有一個int
由於它是一個有效的類型,你也可以使用 typedef 來定義它:

typedef void(*printHiFunction)(int);

  printHiFunction Print = Hi;
  Print(5);

我們需要制作一個 for-each 循環 function 的工作示例,以使用這種類型在向量中顯示值。 我似乎找不到任何線索,因為我什至不知道類型..但是我們的教授確實提到要更好地使用“lambdas”,我在網上查了一下,但我不清楚它是什么. 任何提醒都會非常有幫助。

我看不出你如何只使用 function 指針來實現它(或者當你沒有它時有什么用處)。 否則,您的教授可能希望您絕對使用 lambda。 它只是一個匿名的臨時 function,可以在必要時調用(並像丟棄函數一樣相應地丟棄),也可以作為參數傳遞給 function。 有關其他信息,您可以參考此處


對於基於范圍的循環,您至少需要傳入一個向量,您可以將其聲明為const並像左值一樣通過引用傳遞它,並將 function 指針作為每個循環 function 的第二個參數。 然后,您可以使用 lambda 代替帶有int參數的 function 指針,以便在main()中調用它時僅打印 integer :

void ForEach(const std::vector<int>& values, void(*functionPointer)(int))
{
   for (int value : values)
     functionPointer(value);
}
int main()
{
  std::vector<int> values = {1, 2, 3, 4, 5};
  ForEach(values, [](int value)
  { std::cout << value << " "; });
}

Output: 1 2 3 4 5

你在這里看到的是一個 function 指針。 Function 指針,顧名思義,指向返回給定類型並接受給定 arguments 列表的 function。 在您的示例中,Print 變量是指向 function 的指針,它返回 void 並接受一個 int 類型的參數。 我建議您閱讀本文中關於 function 指針的部分,並按照 Anirban166 的建議,使用帶有調試器的 IDE。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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