
Peter Simons wrote:
Jason Hise writes:
I am adding a policy to control exactly what happens if creation is attempted while the singleton instance exists. The options thus far include throwing an exception, doing nothing, or destroying and recreating the singleton, depending on the policy used.
Could you post some source code that illustrates what you mean by "creating" an instance?
singleton_ptr < Type > ptr; // smart pointer to single instance ptr.create ( /*ctor params here*/ ); // creates the instance ptr.create ( /*ctor params here*/ ); // instance already exists, what should happen? ptr->SomeMemberFunctionOfType ( 42 ); // perform an action on the singleton
The usual approach to initializing static instances is call_once() from Boost.Thread; so I am curious to know how your approach compares to that.
I will have to look up call_once before I will be able to compare it with my approach.
Does it make sense to have a similar policy for what happens when attempting to destroy an already destroyed instance?
A failed assertion would be my preferred way to handle this condition; I don't see the need for a policy class.
Others have expressed (perhaps not publicly) that their preferred method would be that secondary destructions are simply no-ops, rather than being errors or asserting at all. Such conflicting interests make it seem like a policy is indeed necessary. Or perhaps just multiple destroy functions (destroy_if_exists, destroy_assert_if_null). -Jason