27 static void exec(NodeType* container,
Traverser& traverser, FnArgsTypes&&... args)
29 for (
auto* child : container->children())
31 if (!child->children().empty())
33 auto* sub_container =
static_cast<std::conditional_t<std::is_const_v<NodeType>,
const NodeType, NodeType
>*>(child);
34 traverser.pre(child, std::forward<FnArgsTypes>(args)...);
35 traverser.apply(child, std::forward<FnArgsTypes>(args)...);
36 exec(sub_container, traverser, std::forward<FnArgsTypes>(args)...);
37 traverser.post(child, std::forward<FnArgsTypes>(args)...);
39 traverser.apply(child, std::forward<FnArgsTypes>(args)...);