monarch_dodra:

Is this not the case for D? Or is it currently a limitation?

In this case I think D is working as designed. All functions inside a template are created when you instantiate it.


Can I ever expect we'll get a "conditionally compiled on requirement" functionality for template struct member functions.

I have asked for a @templated(Arg1, Arg2, ...) that's usable for this purpose too, but Walter has not commented so far.


struct C(T)
{
    private T val;
    static if(isAssignable(T!T))
    {
        @property void front(T value)
            {val = value;}
    }
}

Probably such use of a static if (or debug, version, etc) is the idiomatic way to do what you want in D. It's easy to see and understand for the person that reads the code.


struct C(T)
{
    private T val;
    @property void front()(T value)
        {val = value;}
}

This works, and is correctly "conditionally compiled on requirement". The signature is kind of kludgy, but it works... AND, if someone *does* attempt to make the call, then a verbose compile error appears.

This doesn't look bad, just remember this doesn't work:


struct C(T) {
    private T val;
    @property void front()(T value) {
        val = value;
    }
}
void main() {
    C!int ci;
    auto f = &ci.front;
    assert(ci.val == 0);
    f(1);
    assert(ci.val == 1);
}

Bye,
bearophile

Reply via email to