我最近遇到了一段代码,如下所示:
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()
的第三个参数。第三个参数可以是函数指针。这是在另一个函数的参数中定义函数指针的内联方式吗?我以前没见过这种用法。我的理解是否正确?
感谢。
答案 0 :(得分:3)
std::find_if
是模板化的,并接受通用仿函数(也称为“函数对象”)作为第三个参数,这是可以被称为函数的任何东西。这类“事物”包括函数指针,任何重载函数调用操作符和lambdas的对象。
在这种特定情况下,您会看到它与lambda函数一起使用,该函数是一个定义的匿名函数。
Lambdas不只是“一种定义函数指针的方法”;相反,他们使用给定的代码和捕获的上下文“动态”创建函数对象。 lambda和“常规函数”之间的关键区别在于lambdas可以捕获上下文(示例中的变量p
)。
此外,指向具有相同签名的函数的指针具有相同的类型,而lambdas具有未指定的类型。仍然,一个不捕获任何东西的lambda隐式转换为普通的函数指针(参见C ++11§5.1.2/ 6,感谢Cheers and hth. - Alf指出这个);这使得即使只接受函数指针而不是通用仿函数的函数也可以使用它们。
你可能还没有看到lambdas,因为它们是C ++语言的最新成员(它们已经在C ++ 11标准中被标准化,仅在今年获得批准)。
答案 1 :(得分:1)
第三个参数不是函数指针。它是一个函数 object 。该对象可能恰好是指针。但它可能不会。它可以是具有operator()
的任何值。 lambda就是这样的值。
答案 2 :(得分:1)
这是一个C ++ 11 lambda(匿名函数)。
答案 3 :(得分:1)
看起来您已经找到了一些C ++ 11代码。你在那里处理一些事情:
您需要进行一些阅读以准确了解该代码的作用。