|
Boost Users : |
Subject: Re: [Boost-users] [random] Singleton engine
From: Diederick C. Niehorster (dcnieho_at_[hidden])
Date: 2009-07-28 23:47:09
Hi All,
My code has now become what is pasted below. It does the trick and
allows for singletons with a parameterized constructor.
This leaves the question of whether a singleton library would be a
useful addition to boost. I would be willing to code and write, though
this would be a learning process for me.
Best,
Diederick
-----
singleton class:
--- #pragma once // Meyers singleton with support for constructors with 1 parameter // http://www.devarticles.com/c/a/Cplusplus/C-plus-plus-In-Theory-The-Singleton-Pattern-Part-I/ // http://www.devarticles.com/c/a/Cplusplus/C-plus-plus-In-Theory-The-Singleton-Pattern-Part-2/ // http://www.devarticles.com/c/a/Cplusplus/The-Singleton-Pattern-Revisited/ // http://www.cplusplus.com/forum/beginner/1459/ template <class T> class Singleton { public: static T& Instance() { static T _instance; return _instance; } template<class P> static T& Instance(const P & p) { static T _instance(p); return _instance; } private: Singleton(); // ctor hidden ~Singleton(); // dtor hidden Singleton(Singleton const&); // copy ctor hidden Singleton& operator=(Singleton const&); // assign op hidden }; ---- Random number class with default engine: ---- #pragma once // includes #include <boost/random.hpp> #include <time.h> #include <iostream> #include "Singleton.h" // namespaces namespace s = std; namespace b = boost; // declaration template<class Dist> class CRandom : public b::variate_generator<b::mt19937&,Dist> // notice the reference, we do not want to copy the engine { public: /** use for Dist: CRandomI Ci(min,max); uses uniform_int<int> - integral types CRandomR Cr(min,max); uses uniform_real<double> - floating point types for other ditributions or types, use: CRandom<distribution<optional type>> Cr(0--3 params, depending on distribution); for distributions and params, see: http://www.boost.org/doc/libs/1_39_0/libs/random/random-distributions.html */ // forwarding constructors explicit CRandom() : variate_generator<b::mt19937&,Dist>( Singleton<b::mt19937>::Instance(unsigned int(time(NULL))), Dist() ) { } template<class P> explicit CRandom(const P & p1) : variate_generator<b::mt19937&,Dist>( Singleton<b::mt19937>::Instance(unsigned int(time(NULL))), Dist(p1) ) { } template<class P1, class P2> explicit CRandom(const P1 & p1, const P2 & p2) : variate_generator<b::mt19937&,Dist>( Singleton<b::mt19937>::Instance(unsigned int(time(NULL))), Dist(p1, p2) ) { } template<class P1, class P2, class P3> explicit CRandom(const P1 & p1, const P2 & p2, const P3 & p3) : variate_generator<b::mt19937&,Dist>( Singleton<b::mt19937>::Instance(unsigned int(time(NULL))), Dist(p1, p2, p3) ) { } }; // end declaration // shorthand typedefs typedef CRandom<b::uniform_int<int>> CRandomI; // even int is default type , specify it in case it ever changes typedef CRandom<b::uniform_real<double>> CRandomR; // even double is default type, specify it in case it ever changes // boolean: class whose () operator returns a random true or false class CRandomB { public: CRandomB(void) : _Cr(CRandomR(0.,1.)) {} bool operator()() { return _Cr() <= .5; } private: CRandomR _Cr; };
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net