| Thread overview | |||||||
|---|---|---|---|---|---|---|---|
| 
 | 
| August 04, 2012Variadic Template: cast problem | ||||
|---|---|---|---|---|
| 
 | ||||
| This code http://dpaste.dzfl.pl/6caed813 does only compile if i comment out the "Clone" method. Why? o.O | ||||
| August 04, 2012Re: Variadic Template: cast problem | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Namespace | 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, 2012Re: Variadic Template: cast problem | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Dmitry Olshansky | 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, 2012Re: Variadic Template: cast problem | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Namespace | 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, 2012Re: Variadic Template: cast problem | ||||
|---|---|---|---|---|
| 
 | ||||
| Posted in reply to Dmitry Olshansky | http://dpaste.dzfl.pl/ff58ffc5 I'm even more confused. o.O | |||
Copyright © 1999-2021 by the D Language Foundation
  Permalink
Permalink Reply
Reply