check instance of nested variadic template

Gianni Pisetta via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Nov 5 06:31:56 PDT 2016


On Friday, 4 November 2016 at 17:37:10 UTC, Basile B. wrote:
>
> Hello, I'm not sure that's exactly what you want but check this:
>
> ============================
> template A(As...) {
>     template B(Bs...) {
>     }
> }
>
> alias BI = A!(1,2).B!(3,4,5);
>
> import std.traits;
>
> template NestedTemplateArgsOf(alias T)
> {
>     alias NestedTemplateArgsOf = 
> TemplateArgsOf!(__traits(parent, T));
> }
>
> alias Bs = TemplateArgsOf!BI;
> alias As = NestedTemplateArgsOf!BI;
>
>
> static if (is(typeof(BI) == typeof(A!As.B!Bs)))
> {
>     pragma(msg, "for the win");
> }
> ============================
>
> The missing key was NestedTemplateArgsOf. With it you can solve 
> the problem.

Well, kind of. But i think i can make it with what i got from 
your example, so thanks.
Another thing that I encountered and while messing with your code 
is that __traits( parent, T ) does not work as expected when you 
have structs instead of template. I think because something like

struct A(As...) {}

is downgraded to

template A(As...) {
   struct A {}
}

when i use __traits( parent, A!(1,2) ) i get in return A!(1,2), 
looping around the same symbol.
When you compile this

struct A(As...) {}

import std.conv;

pragma( msg, "The parent symbol is the same? " ~ to!string( 
__traits( isSame, A!(1,2), __traits( parent, A!(1,2) ) ) ) );

void main() {}

you get a really interesting result:

The parent symbol is the same? true

Gianni Pisetta



More information about the Digitalmars-d-learn mailing list