This discussion is not about iterators, about member vs non-member functions, it was an example of a design flaw fix introduced in C++11
.
Your code changes non-member functions into member functions. Why? Going back to the std::begin example, the non-member based std::begin() design you can implement (add to you design) begin(carray) or begin(myNewType) or begin(SomeOtherDevelopersType) and all your generic algorithm that's are build on top of begin(T) will then also be able to operate on carrays, myNewType, SomeOtherDevelopersType. I've run into this design issue when working on bindings of algorithms to containers.
Cholesky is a good example. The member function version would be M.cholesky(), the non-member function chlolesky(M). Now suppose you want to generate correlated random numbers with some generic design, -using cholesky-, but your correlation matrix is stored in a 3rd party container, from some math lib. How are you going to call it's that cholesky member function in your generic algorithm??
Member vs Non-member is of course not an arbitrary fashionable choice ("variation on a theme"), but a choice to be made on rational arguments, and one with design consequences.
Going back to the distribution case you've posted: what rational process let to you not using the non-member boost function and write code to convert it to member functions versions? What benefits does this member version design have to justify this, ..what problem is being solved?
A classic is this article:
http://www.drdobbs.com/cpp/how-non-memb ... /184401197