"static static" again

bearophile bearophileHUGS at lycos.com
Sun Aug 21 01:39:43 PDT 2011


A not too much serious post fit for a slow Sunday :-)

Time ago I have half-seriously suggested the "static static", to be used to define a static variable that is static (shared) for all instantiations of one function template. With it you avoid a global variable, and you have the advantages of a static variable:


auto foo(T)(T x) {
    static static int n = 0;
    n++;
    return x * n;
}


I have found another use case for static static :-)

You know this idiom, a helper function that helps the instantiation of a struct template (sometimes the static struct Foo is defined inside foo):


struct Foo(T) {
    T x;
}
Foo!U foo(U)(U x_) {
    return Foo!U(x_);
}
void main() {
    Foo!int f1 = foo(1);
    Foo!double f2 = foo(1.5);
}


If opCall is static static, then I think you are allowed to write:


struct Foo(T) {
    T x;
    static static Foo!U opCall(U)(U x_) {
        return Foo!U(x_);
    }
}
void main() {
    Foo!int f1 = Foo(1);
    Foo!double f2 = Foo(1.5);
}


You have just one name (not foo and Foo), and Foo is a global (template) name (it's not hidden inside foo). And I like it being a single piece, instead of two.

The body of static static member functions doesn't get copied for each template instantiation, this helps reduce template bloat a bit.

Bye,
bearophile


More information about the Digitalmars-d mailing list