函数参数包含完整的函数

时间:2017-11-01 14:22:02

标签: c++ c++11 lambda

在我的C ++库代码中,我看到了以下行

 m_libs[ library_name ] = lib_ptr_t( handle, [](void*d){ dlclose(d); });

lib_prt_t在.hpp中声明为

using lib_ptr_t = std::unique_ptr<void,std::function<void(void*)>>;

任何人都可以解释,在第二个参数中是完整函数还是其他东西。 我无法理解它是什么意思?

2 个答案:

答案 0 :(得分:4)

[](void*d){ dlclose(d); }是一个lambda表达式。

创建一个类的实例非常简单,就像这样:

struct anonymous_name {
  void operator()(void* d) { dlclose(d); }
};

(我跳过了一些不太重要的区别,这里不重要)。 anonymous_name不是生成的类的真实名称,而是给出了一个无法命名的名称。

anonymous_name的实例可以像函数一样调用。

现在,std::function<void(void*)>是一个使用名为&#34; type erasure&#34;的技术的对象。存储几乎所有可以使用签名void(void*)调用的。这包括函数指针或函数对象,如anonymous_name

的实例

答案 1 :(得分:0)

第二个参数是std::unique_ptr的删除函数对象,在这种情况下它是一个lambda但它可以是隐式转换为std::function<void(void*)>的任何东西,它被声明为删除对象的类型。