
On Jan 15, 2008 12:21 PM, Anthony Williams <anthony_w.geo@yahoo.com> wrote:
John Torjo <john.groups <at> torjo.com> writes:
Today starts the formal Fast-Track review of the Boost.Utility/Singleton library. This is a very useful utility, so I'm expecting lots of reviews ;)
* What is your evaluation of the potential usefulness of the library?
I don't think this is at all useful. People should not be encouraged to use singletons, as there is already a tendency towards overuse. In most circumstances, singletons are a poor design choice, so there is little requirement for their use.
I consider singletons just another form of globals and thus bad style. But sometimes they get handy, if you do not want to pass around a context to every function in a module. Anyways, I've regretted too every single singleton that I have used. What about a form of thread local singleton which can be replaced with a scoped construct? //global scope singleton<my_object> my_singleton; void foo() { my_singleton.instance().use_singleton(); // the globaly scoped one or a local replacement. } void bar() { scoped_replacer _ (my_singleton); // replace my_object of baz with a copy my_singleton.instance().perform_local_modification(); foo(); // at this point my_object of baz is reinstantiated } void baz() { scoped_replacer _ (my_singleton, my_object()); // replace the initial my_object // with a copy of the second parameter foo(); // at this point the original my_object is reinstantiated } int main() { baz(); } In practice it is a form of dynamic scoping, which might be more useful and flexible than a static singleton. You definitely want this dynamic scoped object to be per thread. I haven't read Boost.Singleton documentation, maybe it already allows such a functionality. -- gpd