Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
January 20, 2016 Function accepting variadic arguments | ||||
---|---|---|---|---|
| ||||
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 Re: Function accepting variadic arguments | ||||
---|---|---|---|---|
| ||||
Posted in reply to pineapple | 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 Re: Function accepting variadic arguments | ||||
---|---|---|---|---|
| ||||
Posted in reply to pineapple | 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 Re: Function accepting variadic arguments | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | 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 Re: Function accepting variadic arguments | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Kozak | 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 Re: Function accepting variadic arguments | ||||
---|---|---|---|---|
| ||||
Posted in reply to pineapple | 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 Re: Function accepting variadic arguments | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Kozak | 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]
|
Copyright © 1999-2021 by the D Language Foundation