【问题标题】:map set/get requests into C++ class/structure changes将 set/get 请求映射到 C++ 类/结构更改
【发布时间】:2015-01-09 14:43:34
【问题描述】:

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

例如:

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

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

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

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

谢谢

【问题讨论】:

  • 我认为不可能,如果内部和外部类都有一个成员'y'呢?
  • 这是一个单独的问题...无论如何,您可以使用两个不同的键(例如 'fooY' 和 'booY')以便以独特的方式识别每个成员。
  • 听起来你在寻找反思。不幸的是,反射在 C++ 中是故意最小化的。您也许可以使用指向成员函数的指针来完成某些操作,但我不想保留它。

标签: c++ oop


【解决方案1】:

Boost 有用于此目的的属性映射。

它暴露的最基本的接口是

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

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

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

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

  • 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

或编写自定义的。

实际上,甚至有一个 dynamic_property_map 看起来像这样:

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

请注意,agegpa 可以存储在任何地方(甚至可能需要网络请求),但访问权限的差异被位于两者之间的属性映射接口抽象掉了。


我的回答示例:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多