In areas like:
template <class NodeType, typename... Args>
SomeBuilder<Parent> leaf(Args... args)
{
auto child = std::make_shared<NodeType>((args)...);
node->setChild(child);
return *this;
}
there needs to be forwarding to avoid unintended copying:
template <class NodeType, typename... Args>
SomeBuilder<Parent> leaf(Args&&... args)
{
auto child = std::make_shared<NodeType>(std::forward<Args>(args)...);
node->setChild(child);
return *this;
}