message: util: Enhance Join()
diff: @@ -30,10 +30,11 @@ NODISCARD inline std::string TrimString(const std::string& str, const std::strin
  * @param separator The separator
  * @param unary_op Apply this operator to each item in the list
  */
  -template <typename T, typename UnaryOp>
  -std::string Join(const std::vector<T>& list, const std::string& separator, UnaryOp unary_op)
  +template <typename T, typename BaseType, typename UnaryOp>
  +auto Join(const std::vector<T>& list, const BaseType& separator, UnaryOp unary_op)
  + -> decltype(unary_op(list.at(0)))
  {
  - std::string ret;
  + decltype(unary_op(list.at(0))) ret;
  for (size_t i = 0; i < list.size(); ++i) {
  if (i > 0) ret += separator;
  ret += unary_op(list.at(i));
  @@ -41,9 +42,16 @@ std::string Join(const std::vector<T>& list, const std::string& separator, Unary
  return ret;
  }
  +template <typename T>
  +T Join(const std::vector<T>& list, const T& separator)
  +{
  + return Join(list, separator, [](const T& i) { return i; });
  +}
  +
  +// Explicit overload needed for c_str arguments, which would otherwise cause a substitution failure in the template above.
  inline std::string Join(const std::vector<std::string>& list, const std::string& separator)
  {
  - return Join(list, separator, [](const std::string& i) { return i; });
  + return Join<std::string>(list, separator);
  }
  /**
  