On Tuesday, 5 January 2021 at 21:46:34 UTC, Ola Fosheim Grøstad
wrote:
On Tuesday, 5 January 2021 at 21:43:09 UTC, welkam wrote:
Replace alias Bar(T) = Foo!T; with alias Bar = Foo;
struct Foo(T) {}
alias Bar = Foo;
void f(T)(Bar!T x) {}
void main() {
auto foo = Bar!int();
f(foo);
}
The example was a reduced case. One can trivially construct
examples where that won't work.
It is very useful to create a simple alias from a complex type
for export from a type library, then it breaks when people use
that type library to write templated functions.
People do this all the time in C++.
I reread the whole thread. You want something like this except
without mixins and to actually work.
struct Foo(T) {}
mixin template Bar(T) {
Foo!T
}
void f(T)(Foo!T x) {}
void main() {
f(mixin Bar!(int)());
}
In languages you can pass things by value, by reference or by
name. Alias works by the name passing mechanic. You can not use
alias or capture by name here because you cant get a name of
something that doesn't exist yet.
What you want is parametric generation of definition and
insertion in place. Now that's something Walter can understand.