Re: Create constraint for each parameter in template arg pack

2018-08-28 Thread Andrey via Digitalmars-d-learn

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!



Re: Create constraint for each parameter in template arg pack

2018-08-28 Thread vit via Digitalmars-d-learn

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);
}






Re: Create constraint for each parameter in template arg pack

2018-08-28 Thread Alex via Digitalmars-d-learn

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...


Re: Create constraint for each parameter in template arg pack

2018-08-28 Thread bauss via Digitalmars-d-learn

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 ...");
}
}

// ...
}


Re: Create constraint for each parameter in template arg pack

2018-08-28 Thread vit via Digitalmars-d-learn

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));


Create constraint for each parameter in template arg pack

2018-08-28 Thread Andrey via Digitalmars-d-learn

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?