#include template void Merge(Elements&, T) {} template <> inline void Merge(Elements& container, Element element) { container.push_back(std::move(element)); } template <> inline void Merge(Elements& container, Elements elements) { for (auto& element : elements) container.push_back(std::move(element)); } // Turn a set of arguments into a vector. template Elements unpack(Args... args) { std::vector vec; (Merge(vec, std::move(args)), ...); return vec; } // Make |container| able to take any number of argments. #define TAKE_ANY_ARGS(container) \ template \ Element container(Args... children) { \ return container(unpack(std::forward(children)...)); \ }