Карта устанавливает / получает запросы в C++ изменения класса / структуры

Я пытаюсь выяснить, что является лучшим подходом здесь. По сути, у меня есть система, в которой я получаю внешние запросы для установки / получения значений в моей модели. Проблема в том, что моя модель состоит из классов C++, которые могут быть вложенными, тогда как запросы представляют собой простые пары (ключ, значение).

Например:

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

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

Если я получу запрос, который говорит set(y, 21) для данного элемента e действия, которые мне нужно выполнить, будут отличаться в зависимости от того, существуют ли уже foo и boo. Необходимость заботиться о различных возможностях для каждого свойства привела бы к написанию большого количества кода.

Прежде чем изобретать колесо, мне было интересно, есть ли уже библиотека или хорошо известная методика в C++, которая позволяет отображать эти плоские действия в изменения в структурах C++ (которые могут быть вложенными) в общем виде.

Спасибо

1 ответ

Для этого в Boost есть Карты свойств.

Самый элементарный интерфейс, который он предоставляет, это

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

Для карт lvalue / readable вы также можете получить доступ в стиле индексатора

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

Вы можете использовать существующие адаптеры карты свойств:

  • identity_property_map а также 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 на практике это выглядит так:

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

Обратите внимание, что age а также gpa может храниться где угодно (возможно, даже требующий веб-запроса), но разница в доступе абстрагируется подходящим интерфейсом карты, который находится между ними.


Образцы из моих ответов:

Другие вопросы по тегам