Карта устанавливает / получает запросы в 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
может храниться где угодно (возможно, даже требующий веб-запроса), но разница в доступе абстрагируется подходящим интерфейсом карты, который находится между ними.
Образцы из моих ответов:
- Можно ли иметь несколько карт свойств веса ребер для одного графа BOOST?
- Вырезать набор графиков, Boost Graph Library, используя BiMap и контейнер Boost Multi Index для хранения свойств