What is the best way to deal with this?

Jonathan M Davis jmdavisProg at gmx.com
Sat Feb 23 19:45:27 PST 2013


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


More information about the Digitalmars-d mailing list