znode: Eine generische Baumstruktur in ‚modern C++‘

znode ist eine header-only Klasse in modern c++ für generische Baumstrukturen. Zusammen mit dem pugixml  Parser bildet sie die Datenschicht für das xtree widget-set . Die Implementierung verwendet ausschließlich std::c++. Um die Klasse unabhängig vom verwendeten Zeichenkettentyp zu halten, wird  dieser als template-parameter übergeben und es wurde ‚bridge-code‘ für diejenigen String-funktionen hinzugefügt, die in den verschiedenen Basis-Stringklassen untschiedlich implementiert sind, etwa
substr(), split(), is_empty(), find() ...
Dadurch kann die Verarbeitung von Baumstrukturen auch unabhängig vom Qt-Framework implementiert werden, für das xtree widget-set wird der String-Parameter das templates entsprechend mit ‚QString‘ instanziiert. Auch die Datenstruktur für die Nutzlast, in diesem Fall die XML-Attributwerte, wird als template parameter übergeben und ‚drangeerbt‘. Derzeit wird eine einfache std::map<StringType,StringType> verwendet, denkbar wären auch propertymaps mit std::variant oder array-Strukturen mit externem Index. Es ergibt sich folgende Klassendefinition:
//! tree-klasse, besonderheit: der nutzlast & string-type sind templated.
template<typename str_t, typename payload_t>
class zbasic_node : public zid, public payload_t, public std::enable_shared_from_this<zbasic_node<str_t,payload_t>>
{

public:

  using zweak_node = std::weak_ptr<zbasic_node>;
  using zshared_node = std::shared_ptr<zbasic_node>;
  using znode_list = std::vector<zshared_node>;
  using zshared_cref = const std::shared_ptr<zbasic_node>&;

  using str_cref = const str_t&;
  using str_list = std::vector<str_t>;

  using ziterator = znode_iterator<zbasic_node>;

protected:

  zweak_node _parent;
  znode_list _children;

...

};