[Issue 15634] New: new __traits request: isLvalue
via Digitalmars-d-bugs
digitalmars-d-bugs at puremagic.com
Mon Feb 1 08:57:52 PST 2016
https://issues.dlang.org/show_bug.cgi?id=15634
Issue ID: 15634
Summary: new __traits request: isLvalue
Product: D
Version: D2
Hardware: All
OS: All
Status: NEW
Severity: enhancement
Priority: P1
Component: dmd
Assignee: nobody at puremagic.com
Reporter: schveiguy at yahoo.com
If I want a template constraint that requires that some alias/member is an
lvalue, I have to do something very complex (courtesy of Meta from the forums):
template yieldsLval(Aggregate, alias member)
{
import std.traits: ReturnType;
import std.functional: FunctionTypeOf;
import std.typetuple: staticIndexOf;
static if (isSomeFunction!member)
{
enum yieldsLval = __traits(compiles,
{
alias Ftype = FunctionTypeOf!member;
void takesLval(ref ReturnType!Ftype) {}
takesLval(Ftype());
});
}
//It's a member variable
else static if (staticIndexOf!(member.stringof, FieldNameTuple!Aggregate) >
-1)
enum yieldsLval = true;
else
static assert(false, "Symbol " ~ member.stringof ~ " is not a member
function or variable of " ~ Aggregate.stringof);
}
struct S
{
int x;
ref int y() { return x; }
int z() { return 1; }
enum f = 0;
}
void main()
{
static assert(yieldsLval!(S, S.y));
static assert(yieldsLval!(S, S.x));
static assert(!yieldsLval!(S, S.z));
static assert(!__traits(compiles, yieldsLval!(S, S.f)));
}
I'm assuming the compiler has this information pretty handy, since it complains
about using rvalues where lvalues are required all the time.
Can we get a __traits call to get this info out of the compiler?
For reference: https://forum.dlang.org/post/n8ls17$2gvd$1@digitalmars.com
--
More information about the Digitalmars-d-bugs
mailing list