gpt4 book ai didi

函数参数中的c++函数定义

转载 作者:搜寻专家 更新时间:2023-10-31 00:17:57 24 4
gpt4 key购买 nike

我最近遇到了一段代码,如下所示:

static typename handle_set::iterator find(T* p)
{
return std::find_if(handles().begin(), handles().end(), [p](const std::unique_ptr<T,D>& l) { return l.get() == p; });
}

在哪里

typedef typename std::set<std::unique_ptr<T,D>> handle_set;
static handle_set& handles(void)
{
static handle_set h_;

return h_;
}

我的问题是关于这部分的:

[p](const std::unique_ptr<T,D>& l) { return l.get() == p; }

这是函数 std::find_if() 的第三个参数.第三个参数可以是一个函数指针。这是在另一个函数的参数中定义函数指针的内联方式吗?我以前没见过这种用法。我的理解正确吗?

谢谢。

最佳答案

std::find_if 被模板化并接受一个通用的 functor (也称为“函数对象”)作为第三个参数,它是任何可以被称为函数的东西.此类“事物”包括函数指针、重载函数调用运算符和 lambda 的任何对象。

在这种特定情况下,您会看到它与 lambda 函数一起使用,这是一个在适当位置定义的匿名函数。

Lambda 不仅仅是“定义函数指针的一种方式”;相反,他们使用给定的代码和捕获的上下文“即时”创建一个函数对象。 lambda 和“常规函数”之间的一个主要区别是 lambda 可以捕获上下文(您的示例中的变量 p)。

此外,指向具有相同签名的函数的指针具有相同的类型,而 lambda 具有未指定的类型。不过,不捕获任何内容的 lambda 会隐式转换为普通函数指针(参见 C++11 §5.1.2/6,感谢 Cheers and hth. - Alf 指出这一点);这使得它们即使与只接受函数指针而不接受通用仿函数的函数一起使用也很有用。

您可能还没有见过 lambda,因为它们是最近添加到 C++ 语言中的(它们已在 C++11 标准中标准化,今年刚刚获得批准)。

关于函数参数中的c++函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12046960/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com