March 12, 2013 [Issue 9705] New: property parameter-less template function not resolved in typeof | ||||
---|---|---|---|---|
| ||||
http://d.puremagic.com/issues/show_bug.cgi?id=9705 Summary: property parameter-less template function not resolved in typeof Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: Phobos AssignedTo: nobody@puremagic.com ReportedBy: monarchdodra@gmail.com --- Comment #0 from monarchdodra@gmail.com 2013-03-12 11:44:14 PDT --- There is a construct, where one defines a parameter template function, so that the compiler can infer its attributes. The problem is that when said function is a property, it doesn't mix with traits, because it fails the typeof blocks. Explanation: //---- import std.range; struct Infered { size_t length()(){return 0;} } void main() { Infered r; auto len = r.length; //OK static assert(hasLength!Infered); //Error: static assert (hasLength!(Infered)) is false static assert(is(typeof(r.length) : ulong)); //Error: static assert (is(typeof(r.length()()) : ulong)) is false pragma(msg, typeof(r.length).stringof); //Error: expression (r.length()()) has no type // while evaluating pragma(msg, (_error_).stringof) } //---- Such usage is very interesting for wrapper ranges, but they are the most vulnerable: Are concerned: hasLength. isForwardRange. isRandomAccessRange. One workaround is to make the call outside of the typeof, and store the result, and then test result itself eg is(typeof(len) : ulong)). Doing this would shuffle around a lot of code though, so I don't think it's worth doing it. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
Copyright © 1999-2021 by the D Language Foundation