Rory McGuire <rmcgu...@neonova.co.za> wrote:

Does anyone know how to detect if there is a setter for a property? The
code below prints the same thing for both
the setter and the getter of "front":

==============================
import std.traits;

class Foo {
     uint num;

     @property ref uint front() {
         return num;
     }
     @property void front(uint i) {
         num = i;
     }

     ref uint front2() {
        return num;
     }
}

template isProperty(alias func) if (isCallable!(func)) {
        enum isProperty = (functionAttributes!(func) &
FunctionAttribute.PROPERTY)==0 ? false : true;
}

template hasSetter(alias func) if (isCallable!(func)) {
enum hasSetter = (isProperty!(func) && ParameterTypeTuple!(func).length >
0 && ReturnType!(func).stringof != "void") ? true : false;
}

For what it's worth, I would simply check if the property allows assignment. i.e.:

template hasSetter(alias func) if (isCallable!(func)) {
    enum hasSetter = isProperty!(func) &&
        is( typeof( (){ func = ReturnType!(func).init; } ) );
}

--
Simen

Reply via email to