将设置/获取请求映射到 C++ 类/结构更改

2021-12-12 00:00:00 oop c++

我正在尝试找出最好的方法.基本上我有一个系统,我可以在其中接收外部请求,以便在我的模型中设置/获取值.问题是我的模型由可以嵌套的 C++ 类组成,而请求是简单的(键、值)对.

I'm trying to figure out what is the best approach here. Basically I have a system where I receive external requests in order to set/get values in my model. The problem is that my model consists on C++ classes, which can be nested, whereas the requests are simple (key, value) pairs.

例如:

struct Foo {
    void setX(int x);
    int getX() const;

    struct Boo {
        void setY(float y);
        float getY() const;
    }:
};

如果我收到一个对给定元素 e 说 set(y, 21) 的请求,那么我需要执行的操作将根据 foo 和 boo 是否已经存在而有所不同.必须考虑每个属性的不同可能性最终会编写大量代码.

If I receive a request that says set(y, 21) for a given element e, then the actions I need to perform will be different depending on whether or not foo and boo already exist. Having to take care of the different possibilities for each property would end up in writing a lot of code.

在重新发明轮子之前,我想知道 C++ 中是否已经有一个库或一项众所周知的技术,允许以通用方式将这种平面操作映射到 C++ 结构(可以嵌套)中的更改.

Before reinventing the wheel, I was wondering if there is already a library or a well-known technique in C++ that allows mapping this flat actions into changes in C++ structures (which can be nested) in a generic way.

谢谢

推荐答案

Boost 具有用于此目的的属性映射.

Boost has Property Maps for this purpose.

  • http://www.boost.org/doc/libs/1_57_0/libs/property_map/doc/property_map.html

它暴露的最基本的接口是

The most elementary interface it exposes is

get(map, key)
put(pmap, key, val)

对于左值/可读映射,您还可以获得 indexer 样式访问

For lvalue/readable maps you can also get indexer style access

pmap[key];
pmap[key] = newval; // if not const/readonly

您可以使用现有的属性映射适配器:

You can a existing property map adaptors:

  • identity_property_maptyped_identity_property_map
  • function_property_map
  • iterator_property_map
  • shared_array_property_map
  • associative_property_map
  • const_associative_property_map
  • vector_property_map
  • ref_property_map
  • static_property_map
  • transform_value_property_map
  • compose_property_map
  • identity_property_map and typed_identity_property_map
  • function_property_map
  • iterator_property_map
  • shared_array_property_map
  • associative_property_map
  • const_associative_property_map
  • vector_property_map
  • ref_property_map
  • static_property_map
  • transform_value_property_map
  • compose_property_map

或编写自定义的.

甚至还有一个dynamic_property_map 在实践中看起来像这样:

There is even a dynamic_property_map that looks like this, in practice:

put("age",properties,fred,new_age);
put("gpa",properties,fred,new_gpa);

请注意,agegpa 可以存储在任何地方(甚至可能需要网络请求),但是访问的差异被位于介于两者之间.

Note that age and gpa could be stored anywhere (even requiring a web-request, perhaps) but the difference in access is abstracted away by the properymap interface that sits in between.

我的回答示例:

  • 一个图 BOOST 是否可以有多个边权重属性图?
  • 图的割集,Boost Graph Library 使用 BiMap 和 Boost Multi Index 容器来存储属性
  • Is it possible to have several edge weight property maps for one graph BOOST?
  • Cut set of a graph, Boost Graph Library using a BiMap and a Boost Multi Index container to store the properties

相关文章