The backward range can have an input range interface, like retro: void is_word_boundary(Bidi r) { bool is_word_prev = r.prev.empty ? false : isword(r.prev.front); bool is_word_this = r.empty ? false : isword(r.front); return is_word_prev != is_word_this; }