#include <algorithm>
#include <iostream>
#include <regex>
#include <string>
#include <utility>
#include <vector>

std::regex operator ""_re (char const * const str, std::size_t)
{
	return std::regex { str };
}

class split
{
public:
	split(std::regex splitter, std::string original)
		: splitter_ { std::move(splitter) }
		, original_ { std::move(original) }
	{
	}
	
	auto begin() const
	{
		return std::sregex_token_iterator { original_.begin(), original_.end(), splitter_, -1 };
	}
	
	auto end() const
	{
		return std::sregex_token_iterator {};
	}
	
	template <typename Container>
	operator Container () const
	{
		return { begin(), end() };
	}

private:
	std::regex splitter_;
	std::string original_;
};

int main()
{
	using namespace std::literals::string_literals;
	
	std::vector<std::string> const words = split {
		R"(\s+)"_re,
		"hello\tdarkness     my\nold friend"s
	};
	
	for (auto const & word : words)
		std::cout << word << "\n";
		
	for (auto const & number : split { ","_re, "23,42,1337" })
		std::cout << number << "\n";
		
	return 0;
}
