digitalmars.D.learn - Using __traits(getMember...) in alias statement
- Tobias Pankrath (25/25) Nov 17 2011 It would be cool, if the following would be possible.
- Timon Gehr (10/34) Nov 17 2011 This works:
- Tobias Pankrath (1/10) Nov 17 2011 Nice to know, thanks!
- Timon Gehr (4/43) Nov 17 2011 This only works if the __traits gets you a TypeTuple back. (It won't
It would be cool, if the following would be possible.
----
immutable string MemberID = "M";
struct A {}
struct B {
alias A M;
}
template Member(T)
{
static if(__traits(hasMember, T, MemberID))
{
alias __traits(getMember, T, MemberID) Member;
}
else
alias TypeTuple!() Member;
}
void main()
{
alias Member!(B) M;
}
----
Currently dmd will print "basic type expected, not __traits".
Why isn't traits allowed here and if we allow __traits there, would this
introduce any ambiguities?
Tobias
Nov 17 2011
On 11/17/2011 06:12 PM, Tobias Pankrath wrote:
It would be cool, if the following would be possible.
----
immutable string MemberID = "M";
struct A {}
struct B {
alias A M;
}
template Member(T)
{
static if(__traits(hasMember, T, MemberID))
{
alias __traits(getMember, T, MemberID) Member;
}
else
alias TypeTuple!() Member;
}
void main()
{
alias Member!(B) M;
}
----
Currently dmd will print "basic type expected, not __traits".
Why isn't traits allowed here and if we allow __traits there, would this
introduce any ambiguities?
This works:
alias TypeTuple!(__traits(getMember, T, MemberID)) Member;
It is a mere grammar issue. The aliased symbol must look like a valid
type. I'd like that to change too.
This helps a lot with the current state of affairs:
template ID(alias x){alias x ID;}
It will even allow funny things like this:
alias ID!((a,b){return a+b;}) add;
static assert(add(1,2) == 3);
Nov 17 2011
This helps a lot with the current state of affairs:
template ID(alias x){alias x ID;}
It will even allow funny things like this:
alias ID!((a,b){return a+b;}) add;
static assert(add(1,2) == 3);
Nice to know, thanks!
Nov 17 2011
On 11/17/2011 06:41 PM, Timon Gehr wrote:On 11/17/2011 06:12 PM, Tobias Pankrath wrote:This only works if the __traits gets you a TypeTuple back. (It won't work in this case, it will create a one-element tuple). Better use ID from below.It would be cool, if the following would be possible. ---- immutable string MemberID = "M"; struct A {} struct B { alias A M; } template Member(T) { static if(__traits(hasMember, T, MemberID)) { alias __traits(getMember, T, MemberID) Member; } else alias TypeTuple!() Member; } void main() { alias Member!(B) M; } ---- Currently dmd will print "basic type expected, not __traits". Why isn't traits allowed here and if we allow __traits there, would this introduce any ambiguities?This works: alias TypeTuple!(__traits(getMember, T, MemberID)) Member;It is a mere grammar issue. The aliased symbol must look like a valid type. I'd like that to change too. This helps a lot with the current state of affairs: template ID(alias x){alias x ID;} It will even allow funny things like this: alias ID!((a,b){return a+b;}) add; static assert(add(1,2) == 3);
Nov 17 2011









Tobias Pankrath <tobias pankrath.net> 