> @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

Reply via email to