Struct constructor, opCall mess.
Stanislav Blinov
stanislav.blinov at gmail.com
Mon Feb 24 10:13:00 PST 2014
On Monday, 24 February 2014 at 17:15:10 UTC, Remo wrote:
> Well fortunately it seems to be possible to override init
> property.
Fortunately? I think not. It's an abomination that, IMO, has to
be annihilated. Recently Andrei suggested adding more explicit
semantics to .init that may give some leeway in this matter,
although this was concerning classes and non-null default values,
so it may not concern structs at all. Regardless, my advice -
don't try to override .init, i.e. don't invite trouble into your
code :)
> But it still does not called at struct construction.
> http://melpon.org/wandbox/permlink/9EvcdzKUKoufqbJa
Yup.
> So what is proper/best way to mimic default constructor for
> struct ?
Don't do it. Default construction for struct *is* initialization
of its fields.
If you want to do something other that initialize fields - create
a function and call it explicitly. D is not C++, don't expect it
to behave identically. To make it easier when porting code, you
can always temporarily @disable this() so the compiler will stop
whenever you'd use your "special" default construction in C++.
As you've mentioned, the code from your example doesn't need any
special default constructors at all, this will work just fine:
struct Vector(T) {
T x = 0, y = 0, z = 0;
this(T v) { x = y = z = v; }
this(T x, T y, T z) { this.x = x; this.y = y; this.z = z; }
}
unittest {
Vector!double v;
auto v2 = Vector!double(1);
auto v3 = Vector!double(1,2,3);
assert(v.x == v.y && v.y == v.z && v.z == 0);
assert(v2.x == v2.x && v2.y == v2.z && v2.z == 1);
assert(v3.x == 1 && v3.y == 2 && v3.z == 3);
}
Also please take a look at those:
https://d.puremagic.com/issues/show_bug.cgi?id=3438
https://d.puremagic.com/issues/show_bug.cgi?id=6080
https://d.puremagic.com/issues/show_bug.cgi?id=7066
https://d.puremagic.com/issues/show_bug.cgi?id=7597
https://d.puremagic.com/issues/show_bug.cgi?id=8816
https://d.puremagic.com/issues/show_bug.cgi?id=8817
https://d.puremagic.com/issues/show_bug.cgi?id=10413
https://d.puremagic.com/issues/show_bug.cgi?id=11307
There may be some others I've missed; the sheer amount and
unresolved state is terrifying.
More information about the Digitalmars-d-learn
mailing list