size_t sum(size_t n) { return n; } template size_t sum(size_t n, Args&&... args) { return n + sum(std::forward(args...)); } void concat_(std::string& a, const std::string& s) { a += s; } template void concat_(std::string& a, const std::string& s, Args&&... args) { a += s; concat_(s, std::forward(args...)); } template std::string concat(Args&&... args) { std::string result; result.reserve(sum(args.size()...)); concat_(result, std::forward(args...)); return result; }