这个size_t在 lambda 中有什么作用?C++代码

What does this size_t in the lambda do? C++ code

本文关键字:作用 什么 C++ 代码 size lambda 这个      更新时间:2023-10-16

我是C++编程的新手,我遇到了这种语法。有人可以解释此语法中size_t的重点吗?

// Close the file stream.
.then([=](size_t)
{
return fileStream->close();
});

它是传递给函数的参数的类型。函数中不使用该参数。因此,它没有被命名。只有参数的类型在那里。

参数的类型可能存在,可能是因为 lambda 表达式传递到的客户端希望它具有类型size_t的参数。客户端无法知道参数在 lambda 表达式中的使用方式或是否使用它。

这就像回调,您的回调从调用方接收数据,然后您对数据执行任何操作。 因此,如果您不需要数据,则可以跳过命名参数,因为它未引用 您可以通过阅读一些 winapi 函数的文档来查看有关回调的更多示例,尤其是枚举内容。例如 EnumWindows , EnumChildWindows EnumProc ....

正如其他人所说,lambda 表达式

[=](size_t)
{
return fileStream->close();
}

正在传递给方法调用

.then()

为了说明一些额外的信息:通常,称为.then()的方法是期货回调接口的一部分。then()方法在Future<T>对象上调用,其中T是某种类型。它将需要一个回调参数。这会导致回调链接:当Future<T>完成时,我们将有一个T,此时回调是使用该T调用的。

在您的情况下,T = size_t.因此,据推测,调用.then()Future对象返回一个size_t,然后将其传递给lambda[=] (size_t) { ... }。然后,lambda 会丢弃size_t,因为它不需要它。

如果不需要size_t参数,那么获取它有什么意义?好吧,也许原始的Future对象是某种读取调用,它将结果存储在其他地方(即工作是通过副作用完成的)并返回它读取的字节数(size_t)。但是回调只是做一些清理工作,并不关心读取的内容。它类似于以下同步代码:

size_t readFile(char* buf) {
// ... store stuff in buf
return bytesRead;
}
auto closeFileStream(size_t) {
return fileStream->close();
}
closeFileStream(readFile(&buf));

就期货而言,它可能更像是:

Future<size_t> readFile(char* buf) {
// ... asynchronously store stuff in buf
// and return bytesRead as a Future
}
auto closeFileStream(size_t) {
return fileStream->close();
}
readFile(&buf)
.then(closeFileStream)
.get(); // wait synchronously