C++ 中奇怪的函数声明和 lambdas

LMN*_*LMN 3 c++ lambda c++11

所以我正在阅读一些笔记,但我对一些奇怪的声明感到困惑。在下面的代码段中,您可以看到下面的代码块有一个分配给 auto 变量的函数

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

int main()
{
    auto Print = Hi;
    Print(5);
}
Run Code Online (Sandbox Code Playgroud)

但是函数(这里的'Hi')没有方括号 () 并且它仍然有效......那么它是如何工作的呢?让我更感兴趣的是它的类型是什么?最后,当我们调用该变量时,它会打印“Hi5”。

我对这部分很好奇,因为这只是我们代码的一个示例部分。我们需要制作一个 for-each 循环函数的工作示例,以使用这种类型在向量中显示值。

我似乎无法找到任何线索,因为我什至不知道类型……但是我们的教授确实提到使用“lambdas”更好,我在网上查了一下,但我无法清楚地了解它是什么. 任何提醒都会非常有帮助。

Ani*_*166 6

但是函数(这里的'Hi')没有方括号 () 并且它仍然有效......那么它是如何工作的呢?

你在这里观察到的是一个函数指针,顾名思义,它通常是一个指向函数的指针。毕竟,函数只是 CPU 指令,存储在二进制可执行文件的某个地方,这个函数指针指向内存中函数的地址。我们实际上是在检索那些 CPU 指令的位置,其中使用了引用 ( &),这最终等效于&Hi。(有一个隐式转换,因此写作Hi就足够了)

让我更感兴趣的是它的类型是什么?

它的void(*Print)(int)类型是一个 void 类型的函数指针,接受一个整数作为参数。第()一个取消引用*包含函数的名称,Print在您的示例中。(它可以是任何东西,取决于您的自动变量的名称)第二个()表示传递给函数的参数类型,在您的情况下是一个整数,因此有一个int.
由于它是一个有效类型,您也可以使用 typedef 来定义它:

typedef void(*printHiFunction)(int);

  printHiFunction Print = Hi;
  Print(5);
Run Code Online (Sandbox Code Playgroud)

我们需要制作一个 for-each 循环函数的工作示例,以使用这种类型在向量中显示值。我似乎无法找到任何线索,因为我什至不知道类型……但是我们的教授确实提到使用“lambdas”更好,我在网上查了一下,但我无法清楚地了解它是什么. 任何提醒都会非常有帮助。

我不明白您如何仅使用函数指针来实现它(或者如果没有它,您可以简单地做什么)。否则,您的教授可能希望您绝对使用 lambda。它只是一个匿名临时函数,可以在必要时调用(并相应地像扔掉的函数一样丢弃),也可以作为参数传递给函数。有关其他信息,您可以参考此处


对于基于范围的循环,您至少需要传入一个向量,您可以声明const它并像左值一样通过引用传递它,并将函数指针作为每个循环函数的第二个参数。然后,您可以使用 lambda 代替带有int参数的函数指针,以便在调用 in 时仅打印该整数main()

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 << " "; });
}
Run Code Online (Sandbox Code Playgroud)

输出: 1 2 3 4 5