Nullable instantiator anyone?

Phil Lavoie via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Aug 17 18:27:56 PDT 2014


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


More information about the Digitalmars-d-learn mailing list