digitalmars.D.learn - Create constraint for each parameter in template arg pack
- Andrey (6/8) Aug 28 2018 Now I want to add a constraint to "Qwerty" so that each type in
Hello, Let we have two variadic templates:template Qwerty(Values...) {} template Qaz(alias type, Data...) {}Now I want to add a constraint to "Qwerty" so that each type in "Values" pack must be a "Qaz" template. I don't care about values of "type" or "Data" in "Qaz". How to do it in D?
Aug 28 2018
On Tuesday, 28 August 2018 at 12:28:19 UTC, Andrey wrote:Hello, Let we have two variadic templates:import std.meta : allSatisfy; template Qwerty(Values...) if(allSatisfy!(isQaz, Values)){ } template Qaz(alias type, Data...) {} enum isQaz(alias Q : Qaz!Args, Args...) = true; enum isQaz(Args...) = false; alias Foo = Qwerty!(Qaz!(i => i), Qaz!(i => i), Qaz!(i => i));template Qwerty(Values...) {} template Qaz(alias type, Data...) {}Now I want to add a constraint to "Qwerty" so that each type in "Values" pack must be a "Qaz" template. I don't care about values of "type" or "Data" in "Qaz". How to do it in D?
Aug 28 2018
On Tuesday, 28 August 2018 at 12:28:19 UTC, Andrey wrote:Hello, Let we have two variadic templates:I'm not sure if there is a better way, but isInstanceOf (std.traits) seems to work with a static foreach and a static if. template Qwerty(Values...) { static foreach (value; Values) { static if (!isInstanceOf!(Qaz, value)) { static assert(0, "Values are not Qaz only ..."); } } // ... }template Qwerty(Values...) {} template Qaz(alias type, Data...) {}Now I want to add a constraint to "Qwerty" so that each type in "Values" pack must be a "Qaz" template. I don't care about values of "type" or "Data" in "Qaz". How to do it in D?
Aug 28 2018
On Tuesday, 28 August 2018 at 13:05:15 UTC, bauss wrote:On Tuesday, 28 August 2018 at 12:28:19 UTC, Andrey wrote:https://dlang.org/phobos/std_traits.html#TemplateOf maybe...Hello, Let we have two variadic templates:I'm not sure if there is a better way, but isInstanceOf (std.traits) seems to work with a static foreach and a static if. template Qwerty(Values...) { static foreach (value; Values) { static if (!isInstanceOf!(Qaz, value)) { static assert(0, "Values are not Qaz only ..."); } } // ... }template Qwerty(Values...) {} template Qaz(alias type, Data...) {}Now I want to add a constraint to "Qwerty" so that each type in "Values" pack must be a "Qaz" template. I don't care about values of "type" or "Data" in "Qaz". How to do it in D?
Aug 28 2018
On Tuesday, 28 August 2018 at 13:05:15 UTC, bauss wrote:I'm not sure if there is a better way, but isInstanceOf (std.traits) seems to work with a static foreach and a static if. template Qwerty(Values...) { static foreach (value; Values) { static if (!isInstanceOf!(Qaz, value)) { static assert(0, "Values are not Qaz only ..."); } } // ... }Thank you everybody!
Aug 28 2018
On Tuesday, 28 August 2018 at 12:28:19 UTC, Andrey wrote:Hello, Let we have two variadic templates:Generic solution: template Qwerty(Values...) if(allSatisfy!(isInstanceOf!Qaz, Values)){ } class Qaz(alias type, Data...) {} import std.meta : allSatisfy; public import std.traits : isInstanceOf; template isInstanceOf(alias T){ import std.traits : impl = isInstanceOf; static enum isInstanceOf(alias X) = impl!(T, X); static enum isInstanceOf(X) = impl!(T, X); }template Qwerty(Values...) {} template Qaz(alias type, Data...) {}Now I want to add a constraint to "Qwerty" so that each type in "Values" pack must be a "Qaz" template. I don't care about values of "type" or "Data" in "Qaz". How to do it in D?
Aug 28 2018