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

标签 c++ function arguments

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

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/

相关文章:

xcode - 我们什么时候需要按钮在 Swift 中发送参数?

c# - 函数模板和委托(delegate)有什么区别?

c++ - 我可以将 Visual Studio 2015 C++ Redistributable DLL 与我的应用程序捆绑在一起吗?

jquery - 使用 jQuery 的可编辑文本功能

Python。我的简单函数需要永远运行

bash - 如何正确识别/传递 bash 参数

c++ - C 与 C++ 大小

c++ - C++ 标准是否要求有符号整数只有一个符号位?

c - 在函数调用的参数内部定义新函数、数组、结构等

javascript - 如何找到函数定义了多少个参数?