On Saturday, 19 November 2016 at 20:24:09 UTC, Marduk wrote:
On Saturday, 19 November 2016 at 12:55:57 UTC, Marc Schütz wrote:
On Saturday, 19 November 2016 at 11:11:36 UTC, Nordlöw wrote:
On Saturday, 19 November 2016 at 09:38:38 UTC, Marduk wrote:
The difference is that D is more verbose. Am I missing something? Can we have C's behaviour in D?

Something like

auto I(T)(T im)
    if (isNumeric!T)
{
    return complex(0, im);
}

unittest
{
    auto x = 1 + 2.I;
}

Or simply:

enum I = complex(0, 1);
auto x = 1 + 2*I;

Thanks! That's a clever idea.

What I do not understand is why if I declare the array with Complex!double I need to complexify each entry. I would expect that D automatically casts 0.0 to complex(0.0).

I agree, this is unfortunate. I don't know of any reason why the following couldn't work in principle:

Complex!float[] arr = [1.0, 2.0, 3.0, 4.0];
// or even
auto arr = [1+2*I, 2.0, 3.0, 4.0]; // compiler finds common type
// just like it works for
auto arr = [1, 2, 3.0, 4];    // typeof(arr) is double[]

I believe it was a conscious decision. D doesn't do as many implicit type conversion as C++, because they often make it hard to understand what's going on. In the above examples though, IMO it wouldn't be a problem.

Reply via email to