April 03, 2013 [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: ------- |
Copyright © 1999-2021 by the D Language Foundation