Я ищу структуру данных, которая ведет себя аналогично boost::property_tree
, но (необязательно) оставляет реализацию get/set для каждого элемента значения разработчику.
Вы должны сделать что-то вроде этого:
std::function<int(void)> f_foo = ...;
my_property_tree tree;
tree.register<int>("some.path.to.key", f_foo);
auto v1 = tree.get<int>("some.path.to.key"); // <-- calls f_foo
auto v2 = tree.get<int>("some.other.path"); // <-- some fallback or throws exception
Я думаю, вы могли бы злоупотреблять property_tree
для этого, но я еще не изучал реализацию, и у меня было бы плохое отношение к этому, если бы я не знал, что это предполагаемый прецедент.
Написание класса, обрабатывающего запросы типа val = tree.get("some.path.to.key")
путем вызова предоставленной функции, в первую очередь не выглядит слишком сложным, но я могу представить множество особых случаев, которые сделали бы эту довольно громоздкую библиотеку.
Некоторые дополнительные функции могут быть:
-
обработка поддерева: не только обрабатывать терминальные ключи, но и пересылать определенные поддеревья для разделения реализаций. Например.
tree.register("some.path.config", some_handler); // calls some_handler.get<int>("network.hostname") v = tree.get<int>("some.path.config.network.hostname");
-
поиск среди значений/клавиш
- автоматический тип литья (как в
boost::property_tree
) - "перегрузка пути", например. по умолчанию для реализации property_tree для путей без зарегистрированного обратного вызова.
Есть ли библиотека, которая приближается к тому, что я ищу? Кто-нибудь сделал опыт использования boost::property_tree
для этой цели? (Например, путем подклассификации или размещения специальных объектов в дереве, как описано здесь)