Trying to do alias template deduction myself.
Salih Dincer
salihdb at hotmail.com
Mon Apr 3 20:17:00 UTC 2023
On Monday, 3 April 2023 at 19:50:14 UTC, Salih Dincer wrote:
> ... very elegant ...
I like it better when program prints:
```d
> import std.stdio;
import std.meta;
struct Matrix(U, size_t M, size_t N)
{
U[M * N] data;
}
alias P = AliasSeq!(byte, short, int);
alias X = AliasSeq!(3, 3, 4);
alias Y = AliasSeq!(1, 3, 2);
void main()
{
alias Vec3(U) = Matrix!(U, 3, 3);
alias T = float;
Vec3!T cube;
void singleMatrix(U)(in Vec3!U v)
{
typeid(aTypeOf!(v.data)).write(": ");
v.data.writeln;
}
singleMatrix!T(cube); // ok
assert(is(typeof(cube) == Vec3!T));
// ...
alias Vec3Var(U...) = staticMapTrio!(Matrix, U);
alias S = AliasSeq!(P, X, Y);
Vec3Var!S trio;
void triMatrix(U...)(in Vec3Var!(U) vps)
{
foreach(ref v; vps)
{
typeid(aTypeOf!(v.data)).write(": ");
v.data.writeln;
}
}
triMatrix!S(trio); // ok
assert(is(typeof(trio) == Vec3Var!S));
}
template staticMapTrio(alias fun, args...) {
alias staticMapTrio = AliasSeq!();
static foreach (i; 0..args.length / 3) {
staticMapTrio = AliasSeq!(staticMapTrio,
fun!(args[0..$/3][i],
args[$/3..($/3) * 2][i],
args[($/3) * 2..($/3) * 3][i]
)
);
}
}
template aTypeOf(alias A) {
alias Type(T : T[]) = T;
alias aTypeOf = Type!(typeof(A));
}
/* PRINTS:
float: [nan, nan, nan, nan, nan, nan, nan, nan, nan]
byte: [0, 0, 0]
short: [0, 0, 0, 0, 0, 0, 0, 0, 0]
int: [0, 0, 0, 0, 0, 0, 0, 0]
*/
```
SDB at 79
More information about the Digitalmars-d
mailing list