October 17, 2015
Does DMD cache template instantiations?

That is, is it preferred to do, for instance, either

    static      if (isIntegral!T && isUnsigned!(T)) {}
    else static if (isIntegral!T && isSigned!(T)) {}

or

    enum integral = isIntegral!T;
    static      if (integral && isUnsigned!(T)) {}
    else static if (integral && isSigned!(T)) {}

October 17, 2015
On Saturday, 17 October 2015 at 07:48:39 UTC, Nordlöw wrote:
> Does DMD cache template instantiations?

Yes, and it's required by the spec:

"Multiple instantiations of a TemplateDeclaration with the same TemplateArgumentList all will refer to the same instantiation."
http://dlang.org/template.html

>
> That is, is it preferred to do, for instance, either
>
>     static      if (isIntegral!T && isUnsigned!(T)) {}
>     else static if (isIntegral!T && isSigned!(T)) {}
>
> or
>
>     enum integral = isIntegral!T;
>     static      if (integral && isUnsigned!(T)) {}
>     else static if (integral && isSigned!(T)) {}

It *might* make a little difference if you have thousands of instantiations, because for each instantiation the compiler needs to check whether it has already instantiated the templation with that combination of arguments, but I wouldn't worry about it.