用户类希望遍历封装的容器里元素的子结构,并且只认识子结构,不认识元素的结构,遵循最少知识原则(迪米特法则)。
一、前提:
比如有一个结构A,包含了x、y、z三个子结构
message A {
X x = 1;
Y y = 2;
Z z = 3;
}
然后如下a_manager管理了A的聚合many_a_
class a_manager {
......
private:
Container<std::shared_ptr<A>> many_a_;
};
二、用户B的需求:
希望在某些时候可以批量更新子结构z里的数据,并且不需要知道A以及x和y的存在,只知道a_manager(遵循最少知识原则)。
三、解决方法:
把用户”批量修改子结构z“的逻辑写成lambda或者函数,然后通过std::function_ref(详见https://en.cppreference.com/w/cpp/utility/functional/function_ref)传给foreach。
// 给a_manager新增一个publish接口
int32_t a_manager::foreach_z(
std::function_ref<int32_t(Z&)> callback) {
for (auto& a : many_a_) {
if (!a.second) {
continue;
}
int32_t ret = callback(*(a.second->mutable_z()));
if(ret < 0){
return ret;
}
}
return 0;
}
用户B使用的时候
void B::fix_z(){
int32_t ret = get_a_manager().foreach_z([](Z& z) -> int32_t {
......
return 0;
});
}
四、思路来自https://owent.net/
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
https://www.prolightsfxjh.com/article/function-ref-foreach/
Thank you!
------from ProLightsfx
非特殊说明,本博所有文章均为博主原创,未经许可不得转载。
如经许可后转载,请注明出处:https://prolightsfxjh.com/article/function-ref-foreach/
共有 0 条评论