2

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

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()。第三个参数可以是函数指针。这是在另一个函数的参数中定义函数指针的内联方式吗?我以前没有见过这种用法。我的理解正确吗?

谢谢。

4

4 回答 4

3

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

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

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

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

您可能还没有见过 lambda,因为它们是 C++ 语言的最新成员(它们已在 C++11 标准中标准化,今年才批准)。

于 2012-08-21T00:27:57.633 回答
1

第三个参数不是函数指针。它是一个函数对象。该对象可能恰好是一个指针。但它可能不会。它可以是任何具有 的值operator()。一个 lambda 就是这样一个值。

于 2012-08-21T00:25:48.720 回答
1

这是一个 C++11 lambda(匿名函数)。

于 2012-08-21T00:26:12.657 回答
1

看起来您已经找到了一些 C++11 代码。你在那里处理一些事情:

  1. Lambda 函数
  2. 唯一指针
  3. 闭包

您需要进行一些阅读以准确了解该代码的作用。

于 2012-08-21T00:33:01.507 回答