On Monday, 3 October 2016 at 22:28:46 UTC, Andrei Alexandrescu wrote:
Any known workaround?

If you're ok with the hacky approach:

-----
import std.algorithm;
import std.conv;

/// these are in std.traits but private for whatever reason
alias Identity(alias A) = A;
alias parentOf(alias sym) = Identity!(__traits(parent, sym));
alias parentOf(alias sym : T!Args, alias T, Args...) = Identity!(__traits(parent, T));

/// alias itself to the symbol of template instance T
template TemplateOf(T)
{
    enum name = T.stringof;

    // strip everything after '!' (instantiation args)
    enum unqual_name = name.until!(a => a == '!').to!string;

    mixin("alias TemplateOf = parentOf!T." ~ unqual_name ~ ";");
}

template SomethingCool(alias X)
{
    pragma(msg, X.stringof);  // sanity check
    alias Y = X!int;
}

struct MyStruct(T)
{
    alias A = SomethingCool!(TemplateOf!MyStruct);
}

struct Outer
{
    struct Nested(T)
    {
       alias A = SomethingCool!(TemplateOf!Nested);
    }
}

void main ( )
{
    alias MyStruct!int X;
    alias Outer.Nested!int Y;
}
-----

Reply via email to