Skip to content

Instantly share code, notes, and snippets.

@newlawrence
Last active July 12, 2018 21:57
Show Gist options
  • Save newlawrence/b550e04cbe05b18c71d5f6f3e9c257da to your computer and use it in GitHub Desktop.
Save newlawrence/b550e04cbe05b18c71d5f6f3e9c257da to your computer and use it in GitHub Desktop.
Performant C++17 implementation of Python's join function
#include <string_view>
#include <string>
#include <tuple>
class Joint {
std::string _j;
auto& _concat(std::string& s, std::string_view sv) { return s += sv; }
template<typename... Args>
auto& _concat(std::string& s, std::string_view sv, Args... args) {
return _concat(s.append(sv).append(_j), args...);
}
public:
Joint(std::string_view sv) : _j{sv} {}
template<typename... Args>
auto operator()(Args&&... args) {
auto svs = std::make_tuple(std::string_view{std::forward<Args>(args)}...);
std::string s;
auto len = [](auto... args) { return ( args.length() + ... ); };
s.reserve(std::apply(len, svs));
auto concat = [&](auto... args) { return _concat(s, args...); };
return std::apply(concat, svs);
}
};
auto operator"" _join(const char* arr, size_t sz) { return Joint{{arr, sz}}; }
// Usage:
// ","_join("Hello", "world", "!") // returns: std::string{"Hello,world,!"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment