Boost logo

Boost :

From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2008-01-17 13:26:06


Anthony Williams wrote:
> Tobias Schwinger <tschwinger <at> isonews2.com> writes:
>> In fact, "just creating one" should be exactly what this library is all
>> about .
>
> Singleton is also called the Highlander pattern --- there can be only one.
>

Cool! I think I'll rename the library when it gets accepted :-P.

>> OK. With a Singleton, the type serves as the key to access the global
>> which I personally find quite elegant.
>
> and which I find to be the biggest problem with singletons.
>

I see. And it seems to me that you overrate the problem part of it.

>> A singleton can easily hold several instances of any other class, if a
>> container is put into it.
>>
>> Further you can use multiple-inheritance to instantiate many singletons
>> with a common subobject at compile time.
>>
>> So what are the alternatives (concrete interface proposals, please)?
>
> One of the benefits you cite for your singleton design is the
> construction-on-demand, which ensures that things are always constructed when
> required. In that case, how about providing a class:
>
> template<typename T>
> class construct_on_demand;
>
> so you can create instances like:
>
> construct_on_demand<Logger> myLogger;
>
> and any call to myLogger->log() will ensure that the object is constructed
> before first use.
>
> The appropriate operator-> call can also manage destruction order if required.

Interesting.

Now let's see how we'd do it with Singletons:

     class Logger;

     struct myLogger : Logger, boost::singleton<myLogger> {};
     // Please note that:
     // o We do not waste BSS space, and
     // o the instance can be allocated statically.

OK, we use a type instead of the variable name. So what?!

>>>> What is the point of having more than one instance of a class that lives
>>>> in static context -- and how would it be captured syntacticly?
>>> I can imagine a use for having lots of instances of boost::mutex at global
>>> scope --- each mutex protects a different thing. You don't need to capture
>>> the
>>> syntactic idea "there may be more than one of this class" --- that is the
>>> base
>>> level assumption.
>>>
>> Interestingly, you show us that in this very case the things you try to
>> protect should be 'mutexed_singleton'S to avoid namespace pollution and
>> to add clarity .
>
> That was the first thought off the top of my head. It may be that a Locked<T>
> template (such as that mentioned by Phil Endecott) would be a good idea, but
> even then you've got multiple instances of the Locked<> template at global
> scope. My point is that just because something is a global doesn't mean you only
> want one instance of that *class*.

Yes, I do understand your point. I don't believe it is that important,
however :-).

Regards,
Tobias


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk