Last active
July 12, 2018 21:57
-
-
Save newlawrence/b550e04cbe05b18c71d5f6f3e9c257da to your computer and use it in GitHub Desktop.
Performant C++17 implementation of Python's join function
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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