
On 17 Aug 2009, at 04:51, Diederick C. Niehorster wrote:
I have decided to try to do without the whole singleton (although I don't really see what the point is of avoiding a singleton if we still have a global pointer, its almost the same thing) as an exercise and try out Kevin's implementation.
A singleton is extra code and extra work to maintain. Why create yourself more classes, more namespace pollution, and a more complex system when it is not necessary. I think I am just anti singleton. I believe it is far too overused, and apart from in a few niche cases provides nothing but additional complexity.
Hmm, i have tried so, but the syntax to actually extract the random numbers becomes very complicated now (I think i am missing a point here, i am new to boost.function).
Your method 2 is the one I use (except I use =) I wouldn't say it is a lot of typing, or particularly complicated, most editors will let you autocomplete the grng_function and the distribution name, so it's only about 15 keystrokes. In fact it is no different to CRandom<boost::uniform_int<int>> Cr(1,100); If you really wanted you could define a macro to make the function call for you, kind of equivalent to your typedef. I think that would make it harder to read though and not easier, as you would need a macro for each distribution. The reason I like it because I find it very readable and it only adds two symbols to the namespace. Take this code for example, if you had a separate wrapper class for the two distributions, would it be easier to read? (Note I use the old syntax for boost::function because I don't like the new one) boost::shared_ptr<boost::multi_array<int, 2> > vals = fbc_extractCellValues(board); MatrixSwap ms(*vals); boost::function0<bool> RVswapRow = grng_randomVariable( boost::bernoulli_distribution<>()); boost::function0<int> RVindex = grng_randomVariable( boost::uniform_smallint<>(0, board.boardSize()-1)); for(int i=0;i!=10000;++i) { int idx1 = 0, idx2 = 0; while(idx1 == idx2) { idx1 = RVindex(); idx2 = RVindex(); } if(RVswapRow()) { ms.swapRows(idx1, idx2); } else { ms.swapCols(idx1, idx2); } } Thanks, Kevin Martin