#include <array> #include <string> #include <vector> template <std::ranges::range T> requires std::negation_v<std::ranges::sized_range<T>>&& std::same_as<std::ranges::range_value_t<T>, std::wstring> std::wstring join(const T& range, std::wstring_view sep) { size_t buffer_size{ 0 }; size_t count{ 0 }; for (const auto& s : range) { buffer_size += s.size(); ++count; } buffer_size += sep.size() * (count - 1); std::wstring buffer; buffer.reserve(buffer_size); size_t i{ 0 }; for (const auto& s : range) { buffer.append(s); if (++i != count) buffer.append(sep); } return std::move(buffer); } template <std::ranges::range T> requires std::ranges::sized_range<T>&& std::same_as<std::ranges::range_value_t<T>, std::wstring> std::wstring join(const T& range, std::wstring_view sep) { size_t buffer_size{ 0 }; size_t count{ std::ranges::size(range) }; for (const auto& s : range) buffer_size += s.size(); buffer_size += sep.size() * (count - 1); std::wstring buffer; buffer.reserve(buffer_size); size_t i{ 0 }; for (const auto& s : range) { buffer.append(s); if (++i != count) buffer.append(sep); } return std::move(buffer); }