std::function是一个函数包装器模板,最早来自boost库,对应其boost::function函数包装器。在c++0x11中,将boost::function纳入标准库中。该函数包装器模板能包装任何类型的可调用元素(callable element),例如普通函数和函数对象。包装器对象可以进行拷贝,并且包装器类型仅仅只依赖于其调用特征(call signature),而不依赖于可调用元素自身的类型。
一个std::function类型对象实例可以包装下列这几种可调用元素类型:函数、函数指针、类成员函数指针或任意类型的函数对象(例如定义了operator()操作并拥有函数闭包)。std::function对象可被拷贝和转移,并且可以使用指定的调用特征来直接调用目标元素。当std::function对象未包裹任何实际的可调用元素,调用该std::function对象将抛出std::bad_function_call异常。
以www.cplusplus.com中描述的原型说明:
- T : 通用类型,但实际通用类型模板并没有被定义,只有当T的类型为形如
Ret(Args...)
的函数类型才能工作。 - Ret : 调用函数返回值的类型。
- Args : 函数参数类型。
详细std::function
单独示例,请参考——示例
如下就function 与lambda混用给出一个示例:
void init_block_process_func();
err_t add(ial::ial_key_id_t obj_id, const ial::om_block &value);
spt::map<uint32_t, std::function<err_t(OM_OBJ_OPERATION oper, const ial::om_block &value)>> block_funcs_;
void dpl_om_block_fnpu::init_block_process_func()
{
block_funcs_ = {
{ ial::IAL_BLOCK_TYPE_LOOPDETECT, [&](OM_OBJ_OPERATION operation, const ial::om_block &value)
{ return set_ld_block(operation, value); }
},
{ ial::IAL_BLOCK_TYPE_3AH, [&](OM_OBJ_OPERATION operation, const ial::om_block &value)
{ return set_3ah_block(operation, value); }
},
{ ial::IAL_BLOCK_TYPE_SELF_LOOP, [&](OM_OBJ_OPERATION operation, const ial::om_block &value)
{ return set_selfloop_block(operation, value); }
},
{ ial::IAL_BLOCK_TYPE_ERPS, [&](OM_OBJ_OPERATION operation, const ial::om_block& value)
{ return set_l2ring_block(operation, value); }
},
};
}
err_t dpl_om_block_fnpu::add(ial::ial_key_id_t /*obj_id*/, const ial::om_block& value)
{
DPRO_WARN(("dpl_om_block_fnpu::add")(value.apply_obj_id)(value.type)(value.block_oper));
auto func = block_funcs_.find(value.type);
if (func == block_funcs_.end()) {
return UTFP_ERR_SUCCESS;
}
obj_status_ = ial::OBJ_NEW;
return func->second(OM_OBJ_ADD, value);
}