On Wed, 04 Jan 2012 23:19:18 +0100, Caligo <[email protected]> wrote:
I have a function that looks something like this:
bool fun(double theta, out A a, out B b, out C c){ /* ... */ }
if fun() returns false, then nothing is supposed to be assigned to a,
b, c. If it returns true, then values are assigned to a, b, c. Also,
there are two ways to call fun(): If I'm interested in the return
value only, then
1. fun(theta);
otherwise,
2. fun(theta, a, b, c);
Obviously, method #1 won't work because there is no such thing as:
bool fun(double theta, out A a = void, out B b = void, out C c =
void){ /* ... */ }
is there?
So, I have to lose 'out' and use pointers instead:
bool fun(double theta, A* a = null, B* b = null, C* c = null){ /* ...
*/ }
I don't want to use a variadic function for this either because it's
not really a variadic function.
1. Are there any other solutions ?
A few days ago, I posted this code:
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 ) );
}
It would allow you to have a throwaway value to use for default
parameters:
void foo( ref int n = lref(0) ) {
}
Also, note that I'm using ref, not out. out parameters are initialized
to their default value upon entering the function, so would not give
the behavior you want.
2. Would it make sense to have 'out default argument of void' in D?
No. ref and out are basically non-nullable pointers, and having them
nullable opens a whole barrel of worms.