digitalmars.D.bugs - [Issue 9864] New: Allow instantiating eponymous inner template with a single parameter list
- d-bugmail puremagic.com (75/75) Apr 03 2013 http://d.puremagic.com/issues/show_bug.cgi?id=9864
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 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