Ok I think I am kind of getting this. The template name inside a template is it's instantiation. I can do "CheckedInt.variable" and get back the value of "variable" in the current instantiation.
The trouble is, when you do a call like CheckedInt() you will loose all other data that you had before: module binary_ops; import std.stdio : writeln; import std.traits; import std.exception; unittest { auto foo = CheckedInt!(int)(5); auto bar = CheckedInt!(int)(5); foo.x = 4; bar.x = 5; foo = foo + bar; writeln(foo.x); // writes 0 writeln(bar.x); // writes 5 } void main() { } struct CheckedInt(N) if (isIntegral!N) { private N value; int x; this(N value) { this.value = value; } // addition CheckedInt opBinary(string op)(CheckedInt rhs) if (op == "+") { auto result = value + rhs.value; enforce(rhs.value >= 0 ? result >= value : result < value); return CheckedInt(result); } } Here I've lost the value of x. "return CheckedInt(result);" calls the constructor of the already instantiated template, but because of the way D works (afaik) it first has to deconstruct the object before constructing it again. And that includes initializing all members to their .init value before calling the constructor. So, I don't like that return statement at all.. Steven Schveighoffer Wrote: > On Tue, 24 Aug 2010 18:43:49 -0400, Andrej Mitrovic > <andrej.mitrov...@whatever.com> wrote: > > > > I wasn't refering to the mixin, but the call to CheckedInt(). mixin > > compiles "value" ~ op ~ "rhs.value", which in this case evaluates to 5 + > > 5 and the whole call becomes CheckedInt(10). > > > > What I don't understand is how you can construct a new CheckedInt struct > > by calling it with CheckedInt(10), when I have to use a call like > > CheckedInt!(int)(10) outside the struct (in main or in a unittest block). > > Inside a template instantiation, the template name without template > parameters is equivalent to the current instantiation. > > It saves a lot of typing. > > -Steve