Thread overview
Function accepting variadic arguments
Jan 20, 2016
pineapple
Jan 20, 2016
Ali Çehreli
Jan 20, 2016
pineapple
Jan 20, 2016
Daniel Kozak
Jan 20, 2016
Daniel Kozak
Jan 20, 2016
Daniel Kozak
Jan 20, 2016
Daniel Kozak
January 20, 2016
I'd like to make a constructor which takes a variable list of arguments, of a short list of possible types, with different handling depending on the type. I haven't been able to find any documentation or examples that did quite what I'm trying to. Help?

A fun pseudocode example of what I'm trying to do:

this(...){
    foreach(argument){
        if(argument is a number){
            do stuff with it;
        }else if(argument is of type A){
            do other stuff;
        }else if(argument is of type B){
            yet more stuff;
        }
    }
}

January 20, 2016
On 01/20/2016 04:38 AM, pineapple wrote:
> I'd like to make a constructor which takes a variable list of arguments,
> of a short list of possible types, with different handling depending on
> the type. I haven't been able to find any documentation or examples that
> did quite what I'm trying to. Help?
>
> A fun pseudocode example of what I'm trying to do:
>
> this(...){
>      foreach(argument){
>          if(argument is a number){
>              do stuff with it;
>          }else if(argument is of type A){
>              do other stuff;
>          }else if(argument is of type B){
>              yet more stuff;
>          }
>      }
> }
>

import std.stdio;

struct A {
    double d;
}

struct B {
    string s;
}

struct C {
    this(T...)(T args) {
        foreach (arg; args) {
            static if (is (typeof(arg) == int)) {
                writefln("int: %s", arg);

            } else static if (is (typeof(arg) == A) ) {
                writefln("A: %s", arg);

            } else static if (is (typeof(arg) == B)) {
                writefln("B: %s", arg);
            }
        }
    }
}

void main() {
    auto c = C(42, A(1.5), B("hello"));
}

Prints:

int: 42
A: A(1.5)
B: B("hello")

And there is another example here:


http://ddili.org/ders/d.en/templates_more.html#ix_templates_more.tuple%20template%20parameter

Ali

January 20, 2016
V Wed, 20 Jan 2016 12:38:20 +0000
pineapple via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
napsáno:

> I'd like to make a constructor which takes a variable list of arguments, of a short list of possible types, with different handling depending on the type. I haven't been able to find any documentation or examples that did quite what I'm trying to. Help?
> 
> A fun pseudocode example of what I'm trying to do:
> 
> this(...){
>      foreach(argument){
>          if(argument is a number){
>              do stuff with it;
>          }else if(argument is of type A){
>              do other stuff;
>          }else if(argument is of type B){
>              yet more stuff;
>          }
>      }
> }
> 

import std.stdio;

struct S
{
    this(Args...)(Args args)
    {
        foreach(Type, Value;args)
        {
            writefln("Type: %s value: %s", Args[Type].stringof, Value);
        }
    }
}

void main()
{
    auto s = S(1, "string");
}

January 20, 2016
On Wednesday, 20 January 2016 at 12:56:51 UTC, Ali Çehreli wrote:
> And there is another example here:
>
>
> http://ddili.org/ders/d.en/templates_more.html#ix_templates_more.tuple%20template%20parameter
>
> Ali

Thank you!

What's the purpose of "is" in the type checks?

Also, how would I utilize isNumeric from std.traits here, in place of checking only for ints?

January 20, 2016
On Wednesday, 20 January 2016 at 13:04:23 UTC, Daniel Kozak wrote:
> V Wed, 20 Jan 2016 12:38:20 +0000
> pineapple via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
> napsáno:
>
>
> import std.stdio;
>
> struct S
> {
>     this(Args...)(Args args)
>     {
>         foreach(Type, Value;args)
>         {
>             writefln("Type: %s value: %s", Args[Type].stringof, Value);
>         }
>     }
> }
>
> void main()
> {
>     auto s = S(1, "string");
> }

Type should be named Index :)


January 20, 2016
On Wednesday, 20 January 2016 at 13:06:14 UTC, pineapple wrote:
> On Wednesday, 20 January 2016 at 12:56:51 UTC, Ali Çehreli wrote:
>> And there is another example here:
>>
>>
>> http://ddili.org/ders/d.en/templates_more.html#ix_templates_more.tuple%20template%20parameter
>>
>> Ali
>
> Thank you!
>
> What's the purpose of "is" in the type checks?

is is use for compare types

>
> Also, how would I utilize isNumeric from std.traits here, in place of checking only for ints?


struct S
 {
     this(Args...)(Args args)
     {
         foreach(Index, Value;args)
         {
             if (isNumeric!(Args[index]))
             {
                 ...
             }
         }
     }
 }
January 20, 2016
On Wednesday, 20 January 2016 at 13:09:13 UTC, Daniel Kozak wrote:
> On Wednesday, 20 January 2016 at 13:06:14 UTC, pineapple wrote:
>> On Wednesday, 20 January 2016 at 12:56:51 UTC, Ali Çehreli wrote:
>>> And there is another example here:
>>>
>>>
>>> http://ddili.org/ders/d.en/templates_more.html#ix_templates_more.tuple%20template%20parameter
>>>
>>> Ali
>>
>> Thank you!
>>
>> What's the purpose of "is" in the type checks?
>
> is is use for compare types
>
>>
>> Also, how would I utilize isNumeric from std.traits here, in place of checking only for ints?
>
>
> struct S
>  {
>      this(Args...)(Args args)
>      {
>          foreach(Index, Value;args)
>          {
>              if (isNumeric!(Args[index]))
>              {
>                  ...
>              }
>          }
>      }
>  }

isNumeric!(Args[index] should be:
isNumeric!(Args[Index]