CC_CALLBACK之间的区别

本文介绍了C++中使用宏定义实现回调函数参数绑定的方法,通过示例展示了如何利用std::bind绑定特定参数,使函数可以更加灵活地被调用。
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

①__selector__:绑定要回调的函数名,注意要加上命名空间:函数名

②__target__:绑定一个对象

③std::placeholders::_1:绑定的函数里除了第一个参数之外的参数,就是调用函数传参时要传第一个参数,如果_selector_后面有参数,则在用CC_CALLBACK时要绑定

④std::placeholders::_2:依次类推

CC_CALLBACK的作用是让_target_对象用_selector_函数时绑定第0/1/2/3个参数后面参数的值,例如

int add (int i, int j){

return i+j;

}

auto func = CC_CALLLBACK_1(add, this, 10);

 

这时得到的func就相当与func(int i, int j = 10),用的时候可以用func(15),

cout << func(15) << endl; // 结果是15 + 10 = 25,即cout << 25

 

转载于:https://www.cnblogs.com/skysand/p/4247823.html

def add_partition_constraints(routing, manager, data, time_dimension, fixed_cross_time): """实现动态分区访问控制""" solver = routing.solver() # 1. 创建分区状态维度 def zone_callback(from_index): from_node = manager.IndexToNode(from_index) # if from_node == data['depot']: # return -2 # 分拣中心特殊标记 if from_node < data['customer_start_idx']: return -1 # 车辆起点特殊标记 customer_idx = from_node - data['customer_start_idx'] return data['customers'][customer_idx].zone zone_callback_idx = routing.RegisterUnaryTransitCallback(zone_callback) routing.AddDimension( zone_callback_idx, 0, # slack_max 1000, # 分区容量上限 False, # start_cumul_to_zero 'Zone' ) zone_dim = routing.GetDimensionOrDie('Zone') # 2. 为每辆车添加动态分区约束 for vehicle in data['vehicles']: vehicle_id = vehicle.vid allowed_zones = set(vehicle.allowed_zones) cross_time = fixed_cross_time #vehicle.cross_time # 动态分区检查回调 def zone_check_callback(from_index, to_index): nonlocal allowed_zones, cross_time to_node = manager.IndexToNode(to_index) # 允许返回分拣中心 if to_node == data['depot']: return True # 非客户节点直接允许 if to_node < data['customer_start_idx']: return True # 获取目标分区 zone = zone_callback(to_index) # 获取到达时间 arrival_time_var = time_dimension.CumulVar(to_index) min_arrival = solver.Min(arrival_time_var) # 判断是否达到切换阈值 if min_arrival < cross_time: # 检查当前是否已有访问分区 start_index = routing.Start(vehicle_id) first_node_index = routing.NextVar(start_index) # 获取首个分区变量 first_zone_var = zone_dim.CumulVar(first_node_index) # 添加约束:时间阈值前必须与首个分区一致 solver.Add( solver.IfThen( zone_dim.CumulVar(to_index) != -1, zone_dim.CumulVar(to_index) == first_zone_var ) ) # 添加约束:首个分区必须在允许分区内 solver.Add( solver.IfThen( first_zone_var != -1, solver.Member(first_zone_var, list(allowed_zones)) ) ) else: # 添加约束:时间阈值后必须在允许分区内 solver.Add( solver.Member(zone_dim.CumulVar(to_index), list(allowed_zones)) ) return True # 注册转移回调 zone_check_idx = routing.RegisterTransitCallback(zone_check_callback) # 3. 添加软约束确保路径可行性 penalty = 1000000 # 大惩罚值 routing.AddDisjunction( [manager.NodeToIndex(i) for i in range(manager.GetNumberOfNodes())], penalty ) 报错WARNING: All log messages before absl::InitializeLog() is called are written to STDERR F0000 00:00:1749109138.770297 395312 routing.cc:1859] Check failed: kUnassigned != indices[i] (-1 vs. -1)
最新发布
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值