Framework/library для структуры данных, подобной дереву дерева, с общим представлением/установкой-реализацией?

Я ищу структуру данных, которая ведет себя аналогично 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 для этой цели? (Например, путем подклассификации или размещения специальных объектов в дереве, как описано здесь)

Ответы

Ответ 1

Будет ли std:: map выполнять задание, которое вас интересует? Вы пробовали этот подход? Я не совсем понимаю, что вы пытаетесь сделать. Поэтому, пожалуйста, укажите пример домена. Приветствия.

Ответ 2

У меня есть домашний код, который позволяет регистрировать пользовательские обратные вызовы для каждого типа в GitHub. Это довольно простой и по-прежнему отсутствует большинство функций, которые вы хотели бы иметь. Тем не менее, я работаю над второй версией. Я заканчиваю вспомогательную структуру, которая будет выполнять большую часть работы по обратным вызовам. Скажите мне, если вы заинтересованы. Кроме того, вы можете реализовать некоторые из этих функций самостоятельно, так как код для регистрации обратных вызовов уже выполнен. Это не должно быть так сложно.

Ответ 3

Использование только предоставленных структур данных:

Во-первых, getters и seters не являются родными функциями для С++, вам нужно вызвать метод так или иначе. Чтобы совершить такое поведение, вы можете перегрузить оператор присваивания. Я предполагаю, что вы также хотите хранить данные POD в своей структуре данных. Поэтому, не зная тип данных, которые вы получаете, единственный вариант, о котором я могу думать, - использовать boost:: variant. Но все-таки у вас есть перегрузка, и вам нужно хотя бы одно задание.

Вы можете проверить документацию. Это довольно прямолинейно и легко понять.

http://www.boost.org/doc/libs/1_61_0/doc/html/variant/tutorial.html


Создание собственных структур данных:

В качестве альтернативы, как сказал Дани, вы можете придумать свою собственную реализацию и сохранить регистр перегруженных методов и т.д.

Лучшие

Ответ 4

После нескольких лет программирования моих собственных классов контейнеров я закончил использование QVariantMap. Таким образом, он в значительной степени ведет себя (и так же гибко, как) python. Только один интерфейс. Однако не для кода производительности.

Если вы хотите знать, я действительно отказался от Qt как моего де-факто STL, потому что:

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