www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 9864] New: Allow instantiating eponymous inner template with a single parameter list

http://d.puremagic.com/issues/show_bug.cgi?id=9864

           Summary: Allow instantiating eponymous inner template with a
                    single parameter list
           Product: D
           Version: future
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: andrej.mitrovich gmail.com


--- Comment #0 from Andrej Mitrovic <andrej.mitrovich gmail.com> 2013-04-03
01:03:55 PDT ---
Here's a hasField template which allows you to instantiate it with only one
parameter to create an alias:

-----
template hasField(string name)
{
    template hasField(T)
    {
        enum bool hasField = __traits(hasMember, T, name);
    }
}

struct S1 { int x; }
struct S2 { int y; }

void main()
{
    alias hasX = hasField!"x";

    static assert(hasX!S1);
    static assert(!hasX!S2);

    static assert(hasField!("x", S1));  // ng
}
-----

Unfortunately we cannot use this template directly. We can turn it into a
normal template:

-----
template hasField(string name, T)
{
    enum bool hasField = __traits(hasMember, T, name);
}
-----

But then we lose the ability to alias the template with a single type
parameter:

-----
alias hasX = hasField!"x";  // ng
-----

There is a library workaround for this, by introducing a Curry template:

-----
template Curry(alias Templ, T...)
{
    template Curry(X...)
    {
        alias Curry = Templ!(T, X);
    }
}

template hasField(string name, T)
{
    enum bool hasField = __traits(hasMember, T, name);
}

struct S1 { int x; }
struct S2 { int y; }

void main()
{
    alias hasX = Curry!(hasField, "x");  // ok

    static assert(hasX!S1);
    static assert(!hasX!S2);

    static assert(hasField!("x", S1));  // ok
}
-----

Nevertheless it would be nice to be able to use the first syntax as well.

I consider this a low priority enhancement since a library workaround exists.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 03 2013