Thread overview
Create constraint for each parameter in template arg pack
Aug 28, 2018
Andrey
Aug 28, 2018
vit
Aug 28, 2018
bauss
Aug 28, 2018
Alex
Aug 28, 2018
Andrey
Aug 28, 2018
vit
August 28, 2018
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
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
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
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
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
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!