Fortunately?
Yes I think it is. Of course it could be made a more safe in some way.

I think the big advantage of D is that it has 'bridge' to C and C++.
This way it appears to be easy to port some C++ code to D.
And it appears to be easy to interconnect C++ and D code. (via Dll for example)

@disable this()
Yes this is possible.
But then why it is not possible to use something like this ?
@default this();

For Vector example this works pretty well this way.
But my main problem is more complicated.

extern(C)  int init(ref CWrapper p);
extern(C) void free(ref CWrapper p);

struct CWrapper
{
  //some data that must be the same at C side.
  Data m_data;

  this() {
     init(&this);
  }
  ~this() {
     free(&this);
  }
}

How to do something like this in D ?
Using class appears for me to be wrong direction.


On Monday, 24 February 2014 at 18:13:02 UTC, Stanislav Blinov wrote:
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.

Reply via email to