Re: rvalue references template ?

2012-01-02 Thread Timon Gehr

On 01/02/2012 03:02 PM, Joshua Reusch wrote:

Is it possible to create a template turning any value into a lvalue?
This would be helpful if a function expects a reference but you dont
need the result of the change:

///decode(S)(in S str, ref size_t index);
auto c = std.utf.decode(some_string, lval!0);


Yes, but I currently cannot see a full solution that does not heap-allocate.


Re: rvalue references template ?

2012-01-02 Thread Simen Kjærås
On Mon, 02 Jan 2012 15:02:30 +0100, Joshua Reusch yos...@arkandos.de  
wrote:



Is it possible to create a template turning any value into a lvalue?
This would be helpful if a function expects a reference but you dont  
need the result of the change:


///decode(S)(in S str, ref size_t index);
auto c = std.utf.decode(some_string, lval!0);



template LRef( T, string f = __FILE__, int l = __LINE__ ) {
static T LRef;
}

ref T lref( T, string f = __FILE__, int l = __LINE__ )( T value ) {
LRef!( T, f, l ) = value;
return LRef!( T, f, l );
}

unittest {
assert( __traits( compiles, lref(0) = 3 ) );
}

This seems to work for me. 'course, there are limitations. Behind the
scenes, this creates a global variable per instantiation, and it
cannot be used more than once per line.


Re: rvalue references template ?

2012-01-02 Thread Joshua Reusch

Am 02.01.2012 22:13, schrieb Simen Kjærås:

On Mon, 02 Jan 2012 15:02:30 +0100, Joshua Reusch yos...@arkandos.de
wrote:


Is it possible to create a template turning any value into a lvalue?
This would be helpful if a function expects a reference but you dont
need the result of the change:

///decode(S)(in S str, ref size_t index);
auto c = std.utf.decode(some_string, lval!0);



template LRef( T, string f = __FILE__, int l = __LINE__ ) {
static T LRef;
}

ref T lref( T, string f = __FILE__, int l = __LINE__ )( T value ) {
LRef!( T, f, l ) = value;
return LRef!( T, f, l );
}

unittest {
assert( __traits( compiles, lref(0) = 3 ) );
}

This seems to work for me. 'course, there are limitations. Behind the
scenes, this creates a global variable per instantiation, and it
cannot be used more than once per line.


I tried something similar, but always got some compiler errors... I 
think I tried to change a compile-time value. But your function works !


Thank you !