Adding the ?. null verification

Etienne via Digitalmars-d digitalmars-d at puremagic.com
Thu Jun 19 14:05:51 PDT 2014


On 2014-06-19 4:51 PM, H. S. Teoh via Digitalmars-d wrote:
> This assumes that t.init is not a possible valid field value. But in
> that case, there's no need to remap it, you just check for t.init
> instead. For pointers, where .init is null, this isn't a problem, but
> for things like int, where 0 is possible valid value, you may be
> accidentally mapping 0 to the default value when the given field
> actually exists (and has value 0)!

True, you need to mark failure and drag it to the end. Here's another 
try at it:

auto safeDeref(T)(T t, bool failed = false) {
	static struct SafeDeref {
		T t;
		bool fail;
		// Make the wrapper as transparent as possible.
		alias t this;

		auto or(T defVal){
			if (fail)
			{
				return defVal;
			}
			else
			{
				return t;
			}
			
		}
		// This is the magic that makes it all work.
		auto opDispatch(string field)()
			if (is(typeof(__traits(getMember, t, field))))
		{
			alias Memb = typeof(__traits(getMember, t, field));


			static if (is(typeof(t is null))) {
				return safeDeref((t is null) ? Memb.init
				                 : __traits(getMember, t, field), (t is null) ? true 
: false);
			} else {
				return safeDeref(__traits(getMember, t, field), fail);
			}
		}
	}
	return SafeDeref(t, failed);
}




More information about the Digitalmars-d mailing list