> @templated(T) means that foo2() is shared across the various instantiations
> of Bar that share the same U and W types, so it's a template of T only. This
> is useful as one tool to fight template bloat, and it has other purposes too
> (like avoiding some template instantiation errors, because you are asserting
> that foo2 does not need the types U and W to be fully defined correctly).
I missed another potential usage.
This is a common D idiom, present in Phobos too:
struct Foo(T) {
T xx;
}
Foo!T foo(T)(T x) {
return Foo!T(x);
}
void main() {
auto f = foo(5);
}
Maybe is replaceable with this, that avoids the need of a separate global
function, I don't know if this is meaningful:
struct Foo(T) {
T xx;
@templated() static Foo!U opCall(U)(U x) {
return Foo!U(x);
}
}
void main() {
auto f = Foo(5);
}
But Foo can't have a normal ctor, I think.
Bye,
bearophile