On Monday, 1 February 2016 at 22:32:26 UTC, Steven Schveighoffer wrote:
What I wanted essentially was a template constraint that says "this type has a member named foo, and t.foo is an lvalue"

-Steve

Like this?

template hasLValProperty(T, string property) {
    enum hasLValProperty = __traits(compiles, function(ref T x) {
        void requireLVal(V)(ref V y) { }
        requireLVal(mixin("x." ~ property));
    });
}

struct Foo {
    int a;
}
struct Bar {
    int b() {
        return 0; }
}
struct Baz {
    ref int c() {
        static int _c;
        return _c;
    }
}

void test(T, string property)() {
    import std.stdio;
    write(T.stringof, ".", property, " is ");
    if(!hasLValProperty!(T, property))
        write("NOT ");
    writeln("an lvalue");
}

void main() {
    import std.stdio;
        
    test!(Foo, "a")();
    test!(Foo, "b")();
    test!(Bar, "a")();
    test!(Bar, "b")();
    test!(Baz, "c")();
}

(DPaste: http://dpaste.dzfl.pl/5877cc17ffd2)

Reply via email to