我正在阅读有关 boost::function
的内容,我对它的使用以及它与我在文档中找到的其他 C++ 结构或术语的关系有点困惑,例如here .
在 C++ (C++11) 上下文中,boost::function
实例、函数对象、仿函数和lambda 表达式?什么时候应该使用哪种结构?例如,什么时候应该将函数对象包装在 boost::function
中,而不是直接使用该对象?
上述所有 C++ 是否都构造了不同的方法来实现函数式语言中所谓的闭包(一个函数,可能包含捕获的变量,可以作为值传递并由其他函数调用) )?
最佳答案
函数对象和仿函数是同一件事;实现函数调用运算符 operator()
的对象。 lambda 表达式生成一个函数对象。具有 boost::function
/std::function
某种特化类型的对象也是函数对象。
Lambda 的特殊之处在于 lambda 表达式具有匿名且唯一的类型,并且是创建内联仿函数的便捷方法。
boost::function
/std::function
的特殊之处在于,它将任何可调用实体转换为仿函数,其类型仅取决于可调用实体的签名实体。例如,每个 lambda 表达式都有唯一的类型,因此很难在非通用代码中传递它们。如果您从 lambda 创建一个 std::function
,那么您可以轻松地传递包装的 lambda。
关于C++ (C++11) 中的函数对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12821098/