What is the best way to deal with this?

Martin martinbbjerregaard at gmail.com
Sat Feb 23 19:53:20 PST 2013


On Sunday, 24 February 2013 at 03:45:41 UTC, Jonathan M Davis 
wrote:
> On Sunday, February 24, 2013 04:33:29 Martin wrote:
>> 	import std.stdio;
>> 
>> 	class TestClass(T)
>> 	{
>> 	private:
>> 		__gshared TestClass[] globalInstances;
>> 	public:
>> 		this()
>> 		{
>> 			globalInstances ~= this;
>> 		}
>> 
>> 		void test()
>> 		{
>> 			writeln("Address of variable globalInstances is: 0x",
>> globalInstances.ptr);
>> 		}
>> 
>> 	}
>> 
>> 	void main(string[] args)
>> 	{
>> 
>> 		TestClass!(int) t1 = new TestClass!(int);
>> 		TestClass!(string) t2 = new TestClass!(string);
>> 
>> 		t1.test;
>> 		t2.test;
>> 
>> 		readln;
>> 
>> 	}
>> 
>> Outputs:
>> Address of variable globalInstances is: 0x4F3F80
>> Address of variable globalInstances is: 0x4F3F60
>> 
>> Which I guess makes sense since there's seperate 
>> globalInstances
>> variables generated per template instance of the class. I want 
>> to
>> store ALL instances, no matter if it's a TestClass!(int) or
>> TestClass!(string) though.
>> 
>> Should I just use a __gshared void*[] globalInstances outside 
>> of
>> the template and cast when necessary or is there an easier way
>> that I'm too stupid to see? It's really late here...
>
> Every instance of a template is a completely different type 
> than every other
> instance. They have no more relation to each other than
>
> class Foo {}
>
> and
>
> class Bar {}
>
> do. Remember that when you're instantiating a template, your 
> literally
> generating code. It's basically a lot of copying and pasting by 
> the compiler.
> If you want to store something for all instantiaties of a 
> template, then it's
> going to need to be done outside of the template. However, I'd 
> point out that
> in general, keeping track of every instance of a class isn't a 
> good idea, and
> treating each instantiation of a template as if it had a 
> relation to other
> instantiations of a template is also generally a bad idea. You 
> may indeed have
> a use case where it makes sense, but my first inclination would 
> be to suggest
> that you rethink whatever you're doing.
>
> - Jonathan M Davis

Okay maybe that wasn't the best example - but what I'm wondering 
is: Is there a way to do like a TestClass<?> globalInstances like 
in Java?


More information about the Digitalmars-d mailing list