Thread overview
Variadic Template: cast problem
Aug 04, 2012
Namespace
Aug 04, 2012
Dmitry Olshansky
Aug 04, 2012
Namespace
Aug 04, 2012
Dmitry Olshansky
Aug 04, 2012
Namespace
August 04, 2012
This code http://dpaste.dzfl.pl/6caed813 does only compile if i comment out the "Clone" method. Why? o.O
August 04, 2012
On 04-Aug-12 17:57, Namespace wrote:
> This code http://dpaste.dzfl.pl/6caed813 does only compile if i comment
> out the "Clone" method. Why? o.O

Because it calls constructor and fails? I've done substitution for you:
this(const vec!(float,2) values) {
		foreach (index, val; values) {
			this.values[index] = cast(T) val;
		}
	}

No big wonder.

I'd try to fix Clone to:
{
vec!(T, dim) tmp = void;
tmp.values = this.values;
return tmp;
}

-- 
Dmitry Olshansky
August 04, 2012
On Saturday, 4 August 2012 at 14:05:32 UTC, Dmitry Olshansky wrote:
> On 04-Aug-12 17:57, Namespace wrote:
>> This code http://dpaste.dzfl.pl/6caed813 does only compile if i comment
>> out the "Clone" method. Why? o.O
>
> Because it calls constructor and fails? I've done substitution for you:
> this(const vec!(float,2) values) {
> 		foreach (index, val; values) {
> 			this.values[index] = cast(T) val;
> 		}
> 	}
>
> No big wonder.
>
> I'd try to fix Clone to:
> {
> vec!(T, dim) tmp = void;
> tmp.values = this.values;
> return tmp;
> }

Then temp is empty/null and you cannot assign anything to it.
Furthermore temp would get a reference to the original array.

And why it fails?
As i see, Clone calls this opCall method:
[code]
static vec!(T, dim) opCall(U, ubyte dim)(const vec!(U, dim) v) {
    return vec!(T, dim)(v.values);
}
[/code]

A simple workaround is to write

[code]
this(U...)(U values) {
	T[] temp;

	foreach (val; values) {
		temp ~= val;
	}

	foreach (index, val; temp) {
		this.values[index] = cast(T) val;
	}
}
[/code]

instead of

[code]
this() {
    foreach (index, val; values) {
	this.values[index] = cast(T) val;
    }
}
[/code]

But that seems weird to me.
August 04, 2012
n 04-Aug-12 18:16, Namespace wrote:
> On Saturday, 4 August 2012 at 14:05:32 UTC, Dmitry Olshansky wrote:
>> On 04-Aug-12 17:57, Namespace wrote:
>>> This code http://dpaste.dzfl.pl/6caed813 does only compile if i comment
>>> out the "Clone" method. Why? o.O
>>
>> Because it calls constructor and fails? I've done substitution for you:
>> this(const vec!(float,2) values) {
>>         foreach (index, val; values) {
>>             this.values[index] = cast(T) val;
>>         }
>>     }
>>
>> No big wonder.
>>
>> I'd try to fix Clone to:
>> {
>> vec!(T, dim) tmp = void;
>> tmp.values = this.values;
>> return tmp;
>> }
>
> Then temp is empty/null and you cannot assign anything to it.
> Furthermore temp would get a reference to the original array.
>

Doh. I somehow totally expected fixed size vector to be value type (struct).

> And why it fails?
> As i see, Clone calls this opCall method:
> [code]
> static vec!(T, dim) opCall(U, ubyte dim)(const vec!(U, dim) v) {
>      return vec!(T, dim)(v.values);
> }

Then more simple thing is:

return vec!(T, dim)(v.values[]);

Note the [].

Static arrays are not convertible to dynamic implicitly.
Your use of ~= probably does append all of one static array elements in one operation. To check it insert writeln in each iteration of your foreach loops, you might be surprised.


-- 
Dmitry Olshansky
August 04, 2012
http://dpaste.dzfl.pl/ff58ffc5

I'm even more confused. o.O