借助std::function_ref使用foreach遍历封装的容器里元素的子结构

ProLightsfx 2024-11-23 192 11/23

用户类希望遍历封装的容器里元素的子结构,并且只认识子结构,不认识元素的结构,遵循最少知识原则(迪米特法则)

一、前提:

比如一个结构A包含xyz三个子结构

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

- THE END -

ProLightsfx

11月26日14:16

最后修改:2024年11月26日
1

非特殊说明,本博所有文章均为博主原创,未经许可不得转载。

共有 0 条评论