Thread overview |
---|
August 28, 2018 Create constraint for each parameter in template arg pack | ||||
---|---|---|---|---|
| ||||
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?
|
August 28, 2018 Re: Create constraint for each parameter in template arg pack | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrey | On Tuesday, 28 August 2018 at 12:28:19 UTC, Andrey wrote:
> 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?
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));
|
August 28, 2018 Re: Create constraint for each parameter in template arg pack | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrey | On Tuesday, 28 August 2018 at 12:28:19 UTC, Andrey wrote:
> 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?
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 ...");
}
}
// ...
}
|
August 28, 2018 Re: Create constraint for each parameter in template arg pack | ||||
---|---|---|---|---|
| ||||
Posted in reply to bauss | On Tuesday, 28 August 2018 at 13:05:15 UTC, bauss wrote: > On Tuesday, 28 August 2018 at 12:28:19 UTC, Andrey wrote: >> 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? > > 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 ..."); > } > } > > // ... > } https://dlang.org/phobos/std_traits.html#TemplateOf maybe... |
August 28, 2018 Re: Create constraint for each parameter in template arg pack | ||||
---|---|---|---|---|
| ||||
Posted in reply to Andrey | On Tuesday, 28 August 2018 at 12:28:19 UTC, Andrey wrote: > 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? 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); } |
August 28, 2018 Re: Create constraint for each parameter in template arg pack | ||||
---|---|---|---|---|
| ||||
Posted in reply to bauss | 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!
|
Copyright © 1999-2021 by the D Language Foundation