c++ boost-propertytree

c++ - ¿Marco/biblioteca para una estructura de datos similar a un árbol de propiedad con la implementación genérica de obtener/establecer?



boost-propertytree (4)

Usando solo las estructuras de datos proporcionadas:

Primero, los captadores y los definidores no son características nativas de c ++; debe llamar al método de una forma u otra. Para hacer que ocurra tal comportamiento puede sobrecargar el operador de asignación. Supongo que también desea almacenar datos POD en su estructura de datos. Así que sin saber el tipo de datos que está "obteniendo", la única opción que se me ocurre es usar boost :: variant. Pero aún así, tienes algo de sobrecarga que hacer y necesitas al menos una tarea.

Puedes consultar la documentación. Es bastante sencillo y fácil de entender.

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

Haciendo sus propias estructuras de datos:

Como alternativa, como mencionó Dani, puede crear su propia implementación y mantener un registro de métodos sobrecargados, etc.

Mejor

Estoy buscando una estructura de datos que se comporte de manera similar a boost::property_tree pero (opcionalmente) deja la implementación get / set para cada elemento de valor al desarrollador.

Deberías poder hacer algo como esto:

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

Supongo que podría abusar de property_tree para esto, pero aún no he investigado la implementación y me sentiría mal al respecto a menos que supiera que este es un caso de uso previsto.

Escribir una clase que maneje solicitudes como val = tree.get("some.path.to.key") llamando a una función proporcionada no parece demasiado difícil en primer lugar, pero puedo imaginar muchos casos especiales que harían Esta es una biblioteca bastante voluminosa.

Algunas características adicionales podrían ser:

  • manejo de subárbol: no solo maneja las teclas de terminal sino que reenvía ciertos subárboles a implementaciones separadas. P.ej

    tree.register("some.path.config", some_handler); // calls some_handler.get<int>("network.hostname") v = tree.get<int>("some.path.config.network.hostname");

  • buscar entre valores / claves

  • tipo de casting automático (como en boost::property_tree )
  • "sobrecarga de ruta", por ejemplo, por defecto a una implementación property_tree para rutas sin devolución de llamada registrada.

¿Hay una biblioteca que se acerque a lo que estoy buscando? ¿Alguien ha hecho experiencias con el uso de boost::property_tree para este propósito? (Por ejemplo, subclasificando o poniendo objetos especiales en el árbol como se describe here )


¿Un std :: map haría el trabajo que le interesa? ¿Has probado este enfoque? No entiendo muy bien lo que estás tratando de hacer. Así que por favor proporcione un ejemplo de dominio. Aclamaciones.


Después de años de codificar mis propias clases de contenedor, acabé adoptando QVariantMap. De esta manera, se comporta bastante (y es tan flexible como) el pitón. Sólo una interfaz. Sin embargo, no para el código de rendimiento.

Si te interesa saberlo, me derrumbé por Qt como mi STL de facto porque:

  1. Estándar de la industria: utilizado incluso en aviónica y software satelital
  2. Ha existido durante décadas con poco cambio de interfaz (piense en el soporte a largo plazo)
  3. Tiene un excelente rendimiento, documentación impresionante y una enorme base de usuarios.
  4. Amplio conjunto de características, más allá del STL

Tengo un código hecho en casa que te permite registrar devoluciones de llamadas personalizadas para cada tipo en GitHub . Es bastante básico y aún falta la mayoría de las funciones que le gustaría tener. Aunque estoy trabajando en la segunda versión. Estoy terminando una estructura de ayuda que hará la mayor parte del trabajo de hacer devoluciones de llamada. Dime si te interesa. Además, podría implementar algunas de esas características usted mismo, ya que el código para registrar las devoluciones de llamada ya está hecho. No debería ser tan difícil.