Better way to compromise on the lack of template alias resolution stuff?

Elfstone elfstone at yeah.net
Thu Mar 16 03:11:01 UTC 2023


On Wednesday, 15 March 2023 at 19:22:32 UTC, Paul Backus wrote:
> On Tuesday, 14 March 2023 at 10:19:24 UTC, Elfstone wrote:
>> [...]
>
> Currently the best workaround for this is to define `Vector` as 
> a `struct` with `alias this` instead of as an `alias`:
>
> ```d
> struct Matrix(S, size_t M, size_t N)
> {
>     // ...
> }
>
> //alias Vector(S, size_t N) = Matrix!(S, N, 1);
>
> struct Vector(S, size_t N)
> {
>     Matrix!(S, N, 1) data;
>     alias data this;
>
>     // forward constructor calls to wrapped object
>     this(this This, Args...)(auto ref Args args)
>     {
>         import core.lifetime: forward;
>         data = forward!args;
>     }
> }
>
> void foo(U)(Vector!(U, 3) a)
> {
>     import std.stdio;
>     writeln("Called with U = ", U.stringof);
> }
>
> void main()
> {
>     Vector!(float, 3) v;
>     foo(v); // ok
> }
> ```

There's a problem with this approach: I'll have to specialize 
`Vector Matrix.opBinary(Vector)`. I don't plan to separate my 
Vector from Matrix yet. :(


More information about the Digitalmars-d-learn mailing list