#include <string>
#include <iostream>
#include <utility>
#include <iterator>

    template<class Mark, class T>
    struct marked_type {
      T raw;
      marked_type(T&& in):raw(std::forward<T>(in)) {}
    };
    template<typename Mark, typename T>
    marked_type<Mark, T> mark_type( T&& t ) {
      return {std::forward<T>(t)};
    }

    struct strange_iteration {};
    template<typename T>
    auto begin( marked_type<strange_iteration, T> const& container )
      -> decltype( std::begin(std::forward<T>(container.raw)) )
    {
      std::cout << "BEGIN";
      return std::begin(std::forward<T>(container.raw));
    }
    template<typename T>
    auto end( marked_type<strange_iteration, T> const& container )
      -> decltype( std::end(std::forward<T>(container.raw)) )
    {
      std::cout << "END";
      return std::end(std::forward<T>(container.raw));
    }        
int main() {
    std::string s = "hello world";
    for( char c : mark_type<strange_iteration>(s) ) {
      std::cout << c;
    }
    std::cout << "\n";
}