28requires std::ranges::range<ContainerType> &&
requires (ContainerType c){c.empty();
typename ContainerType::value_type;}
31 const ContainerType& container,
32 const std::string& value_separator, StringConverterType string_converter)
35 std::same_as<std::invoke_result_t<StringConverterType, typename ContainerType::value_type>, std::string>,
36 "StringConverterType must return std::string"
38 if (container.empty()){
41 return std::ranges::fold_left(
42 std::ranges::next(std::ranges::begin(container)),
43 std::ranges::end(container),
44 std::invoke(string_converter, *std::ranges::begin(container)),
45 [&](
const auto& left,
const auto& right){
46 return left + value_separator + std::invoke(string_converter, right);