Thread overview
Typesafe variadic argument taking struct
Oct 20, 2016
Satoshi
Oct 20, 2016
rikki cattermole
Oct 20, 2016
Satoshi
Oct 20, 2016
Meta
Oct 20, 2016
Nordlöw
Oct 20, 2016
Satoshi
October 20, 2016
Hello,
why ... cannot be used with structs?

struct Foo {
    this(int a) { }
}

void bar(Foo foo...) {

}

bar(42);
October 21, 2016
On 21/10/2016 1:48 AM, Satoshi wrote:
> Hello,
> why ... cannot be used with structs?
>
> struct Foo {
>     this(int a) { }
> }
>
> void bar(Foo foo...) {
>
> }
>
> bar(42);

Because an int is not a Foo.
October 20, 2016
On Thursday, 20 October 2016 at 12:52:42 UTC, rikki cattermole wrote:
> On 21/10/2016 1:48 AM, Satoshi wrote:
>> Hello,
>> why ... cannot be used with structs?
>>
>> struct Foo {
>>     this(int a) { }
>> }
>>
>> void bar(Foo foo...) {
>>
>> }
>>
>> bar(42);
>
> Because an int is not a Foo.


Oh, really? I didn't notice that... (sarcasm)

If I change struct Foo to class Foo it works.
October 20, 2016
On Thursday, 20 October 2016 at 12:48:34 UTC, Satoshi wrote:
> Hello,
> why ... cannot be used with structs?
>
> struct Foo {
>     this(int a) { }
> }
>
> void bar(Foo foo...) {
>
> }
>
> bar(42);

Being explicit about these things makes complex code more clear.
October 20, 2016
On Thursday, 20 October 2016 at 16:04:00 UTC, Nordlöw wrote:
> On Thursday, 20 October 2016 at 12:48:34 UTC, Satoshi wrote:
>> Hello,
>> why ... cannot be used with structs?
>>
>> struct Foo {
>>     this(int a) { }
>> }
>>
>> void bar(Foo foo...) {
>>
>> }
>>
>> bar(42);
>
> Being explicit about these things makes complex code more clear.

With class it works fine.
https://dlang.org/spec/function.html#typesafe_variadic_functions

I have struct Point(x, y) and I want to let the people call some methods with Point or just pass x and y argument. I can make Point as a class but it's not efficient.

I think this
void moveMouseTo(float x, float y);
is same clear as
void moveMouseTo(Point point);
October 20, 2016
On Thursday, 20 October 2016 at 14:29:53 UTC, Satoshi wrote:
> Oh, really? I didn't notice that... (sarcasm)
>
> If I change struct Foo to class Foo it works.

It's because for some weird reason, this type of varargs allows implicit construction of an object. I don't know why, it's just a feature that was added a long time ago and never removed. However as you can see, it doesn't work for structs and IMO you should never use it.