在我的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*)>>;
任何人都可以解释,在第二个参数中是完整函数还是其他东西。 我无法理解它是什么意思?
答案 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*)>
的任何东西,它被声明为删除对象的类型。