Pattern for writing a generic string transformation function
Look at Boost.Range.  Your first point drives most of the rest of the concerns.

Write your template function to take a Range.  You can pass it a C string literal, a std::string, an array, vector, or anything —— even a pair of iterators if that’s what you need after all.

Not limited to char?  No problem: make it a Range of T, with a default of char.

This takes the place of your initial idiomatic approach.  Use ranges rather than iterators, and you don’t need to wrap it for convenience.  Boost.Range does all that for you.

The output can remain an output iterator, but I like to make it a range adaptor.

With that, you can do things like:

for (auto c : mystring|escaped) { ⋯