AliasSeq of AliasSeq, or meta-functions that take multiple lists

Jean-Louis Leroy via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jun 20 07:25:23 PDT 2017


On Monday, 19 June 2017 at 20:59:33 UTC, Ali Çehreli wrote:
> On 06/19/2017 12:54 PM, Jean-Louis Leroy wrote:
>> I need to process two sequences in parallel (select some 
>> elements of
>> sequence A depending of the corresponding element of sequence 
>> B). How
>> can I pass two sequences to a meta-function? I tried nesting 
>> AliasSeqs
>> but I get Perl4 style flattening:
>>
>>   AliasSeq!(AliasSeq!(int, float),
>>             AliasSeq!(char, double))
>>   -> (int,float,char,double)
>>
>> I worked around the problem by passing a single AliasSeq to my
>> meta-function and using indexation to access the two sub-lists 
>> but now I
>> need to process three sequences in parallel and I am looking 
>> for a
>> cleaner solution.
>>
>>
>
> Hi Jean-Louis! :)
>
> One option is to nest templates:
>
> template foo(Args1...) {
>     void bar(Args2...)() {
>     }
> }
>
> void main() {
>     foo!(int, float).bar!(char, double)();
> }
>
> Ali

Hi Ali :)

Thanks! It works perfectly for my purpose, which is to manipulate 
lists of types or values based on a list of types, e.g.:

   alias ParTypes = AliasSeq!(virtual!A, int, virtual!B);
   Signature!(ParTypes).UnqualArgs -> AliasSeq!(A, int, B)
   Signature!(ParTypes).VirtualArgs -> AliasSeq!(A, B)
   Signature!(ParTypes).Filter!(AliasSeq!(A, int, B)) -> 
AliasSeq!(A, B)

J-L




More information about the Digitalmars-d-learn mailing list