On Saturday, 8 April 2017 at 09:47:07 UTC, biocyberman wrote:
On Friday, 7 April 2017 at 23:53:12 UTC, Ali Çehreli wrote:

The difference is that you can't use funcgen as a regular template:

    funcgen!(void, void);

Error: template instance funcgen!(void, void) mixin templates are not regular templates

I think it's good practice to use 'mixin template' if it's intended to be so.

Ali

Thanks for a very concise answer.

In addition to Ali's answer, mixin templates do their symbol looking at the instantiation site, while regular templates do it at the declaration site. Example:

enum a = 0;

template test1()
{
        enum b1 = a; //Okay, a is in scope at the declaration site
        //enum c = d1; Error: undefined identifier d1
}

mixin template test2()
{
        enum b2 = a; //Okay, a is in scope at the declaration site
        enum c = d1; //Okay, d1 is in scope at the *instantiation* site
        //enum e = d2; Error: undefined identifier d2
}

void main()
{
        enum d1 = 0; //<--d1 is declared here
        mixin test1!();
        mixin test2!(); //<--so it is in scope here
        enum d2 = 0; //d2 was not declared before test2 was mixed in
                     //so it is not in scope for test2
}

Reply via email to