Re: template evaluation

2018-04-14 Thread Alex via Digitalmars-d-learn

Ok, trying to reduce my example a little bit, I arrived at this:

´´´
void main(){}

struct D
{
size_t dummy;
auto static s = S!D.init;
}

struct S(alias container = null)
{
pragma(msg, container);

static if(__traits(compiles, __traits(allMembers, container)))
{
static foreach(m; __traits(allMembers, container))
{
pragma(msg, m);

pragma(msg, is(typeof(__traits(getMember, container, 
m;
/*
for D.dummy this yields "true"
for D.s this yields "false"
*/
}
}
}
´´´

What I clearly have, is a circular reference, now I'm aware of 
this.


So, am I trying something illegal? It seems, I can't get the type 
of the according member of the template parameter, even then (or 
should I say "especially because") the analyzing type has the 
same type.
But if this would be the only member, which I can't get the type 
of, the information would be enough, to ensure what I want. Is it 
like this?


template evaluation

2018-04-14 Thread Alex via Digitalmars-d-learn

Hi all,
I must overlook something, but
given this:

´´´
void main(){}

static assert(isMatching!(D, S!(D, true))); // place 1: works as 
expected.


struct D
{
auto static s = S!(typeof(this), true).init;
}

enum bool isMatching(T, U) =
(){
bool b;
static foreach(i, m; __traits(allMembers, T))
{
		static if(is(typeof(__traits(getMember, T, m)) == 
U))

{
   if(b) return false;
   else b = true;
}
}
return b;
}();

struct S(T, bool c = false)
//if(isMatching!(T, S!(T, true))) // place 2: does not work
{}
´´´

While "place 1" works as expected: it static asserts to true, if 
type D has a single coinciding member to the checked one and 
static asserts to false if it doesn't or if there are more of 
them then one;

Why I can't use the same template in "place 2"?


PS: Taken the (){}() pattern from here:
https://p0nce.github.io/d-idioms/#Precomputed-tables-at-compile-time-through-CTFE