Template matching and is expression

Piotr Szturmaj bncrbme at jadamspam.pl
Thu Dec 30 16:31:17 PST 2010


Simen kjaeraas wrote:
> Piotr Szturmaj <bncrbme at jadamspam.pl> wrote:
>
>> static assert(isNullable!(Nullable!int));
>>
>> Question is, what I'm doing wrong?
>
> The problem here is that Nullable!T is not a real type. Hence,
> Nullable!int is actually
> Algebraic!(int,void*). Checking for that apparently does not work as
> simply as one might
> hope.

Algebraic is also an alias for VariantN (which is real type):

template Algebraic(T...)
{
     alias VariantN!(maxSize!(T), T) Algebraic;
}

however this check also yields false:

static if (is(T X == VariantN!(U), U...))

but this works:

static if (is(T == Nullable!int))

so, I was a bit confused...

So, instead you should create a wrapper. This works:
>
>
> struct Nullable(T) {
> Algebraic!(T, void*) Nullable;
> alias Nullable this;
> }
>
> template isNullable(T) {
> static if (is(T X == Nullable!(U), U))
> enum isNullable = true;
> else
> enum isNullable = false;
> }
>
> static assert(isNullable!(Nullable!int));
>

Thanks! I've already used wrappers like that, but I though it's possible 
to match aliases directly.

regards,
Piotr


More information about the Digitalmars-d-learn mailing list