On Sunday, 17 August 2014 at 19:05:11 UTC, Nordlöw wrote:
On Sunday, 17 August 2014 at 18:51:38 UTC, bearophile wrote:
It could be sufficient, but note that in Phobos there are two
different versions of Nullable, one of them doesn't require
extra memory, it uses one value as the "null" value.
Ok, thanks for the reminder.
Do you have a suggestion of an instantiator for this variant?
I'm not sure how to define this. So far I have
Nullable!T nullable(T nullValue, T)(T a, T nullValue)
{
return Nullable!nullValue(a);
}
unittest
{
auto x = nullable!(int.max)(3);
}
but it fails as
mangling.d(50,21): Error: undefined identifier T
How do I make the template parameter nullValue infer type T
with a single template parameter? Is it even possible?
Hi Nordlöw,
I'm not sure I fully understand your question but I'll try and
answer it. First of all, yes, you can have everything inferred as
long as your produce a default value for your null value, a.k.a:
Nullable!(T, nullValue) nullable(T, T nullValue = T.init)(T val)
{
return Nullable!(T, nullValue)(val);
}
unittest{
auto myNullableInt = nullable(5);
assert(!myNullableInt.isNull() && myNullableInt == 5);
}
However, keep in mind that using a sentinel value as the null
value can produce surprises:
unittest{
auto myNullableInt = nullable(0);
assert(myNullableInt.isNull()); //Since T.init == 0
}
Phil