
   #include <iostream>
   #include <vector>
   #include <string>

   using std::cout;

template< typename T >
struct tree_node
   {
   T t;
   std::vector<tree_node> children;
   void walk_depth_first() const;
   };

template< typename T >
void tree_node<T>::walk_depth_first() const
   {
   cout<<t<<"\n";;
   for ( auto & n: children ) n.walk_depth_first();
   }

int main()
   {
   tree_node<std::string> tree;
   tree.t="base";
   tree.children.push_back({"a"});
   tree.children.push_back({"b"});
   tree.children.push_back({"c"});
   tree.children.at(1).children.push_back({"ba"});
   tree.walk_depth_first();
   }
