std::function与lambda表达式混用示例

  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单独示例,请参考——示例

如下就functionlambda混用给出一个示例:

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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值