How to write a singleton template?
    Kyle Furlong 
    kylefurlong at gmail.com
       
    Tue Mar 14 22:03:27 PST 2006
    
    
  
Li Jie wrote:
> I try to write a singleton template, but has not succeeded:
> 
> A:
> template Singleton(T)
> {
> private T _instance;
> 
> static this()
> {
> _instance = new T();
> }
> 
> public T instance ()
> {
> return _instance;
> }
> }
> 
> B:
> template Singleton(T)
> {
> class Singleton
> {
> private static T _instance;
> 
> static this()
> {
> _instance = new T();
> }
> 
> public static T instance ()
> {
> return _instance;
> }
> }
> }
> 
> C:
> template Singleton(T)
> {
> class Singleton
> {
> private static T _instance = null;
> 
> public static T instance ()
> {
> if (_instance == null)
> _instance = new T();
> return _instance;
> }
> }
> }
> 
> 
> // use it:
> 
> class AAA
> {
> public void hello ()
> {
> printf("hello\n");
> }
> }
> 
> int main(char[][] args)
> {
> alias Singleton!(AAA) aaa;
> aaa.instance().hello();  // <== Segment fault !!!!!
> 
> return 0;
> }
> 
> I want to know, how to write a singleton template?
> 
> 
> 
> Thanks.
> 
> - Li Jie
> 
> 
You might want to consider a mixin:
template Singleton(T)
{
	static this()
	{
		_instance = new T();
	}
	public static T instance ()
	{
		return _instance;
	}
	private static T _instance;
}
class OnlyOne
{
	// Can't include this in the mixin,
	// because D can only mixin static things to classes
	private this() {}
	mixin Singleton!(OnlyOne);
}
Or with inheritance:
// Note here that there is some syntactic sugar for templated classes
class Singleton(T)
{
	static this()
	{
		_instance = new T();
	}
	public static T instance ()
	{
		return _instance;
	}
	protected static T _instance;
}
class OnlyOne : Singleton!(OnlyOne)
{
	private this() {}
}
    
    
More information about the Digitalmars-d
mailing list