Thread overview
Compare type with another at CT
Jan 23, 2014
Frustrated
Jan 23, 2014
Adam D. Ruppe
Jan 23, 2014
Frustrated
Jan 23, 2014
Stanislav Blinov
January 23, 2014
I am trying to compare a type with another type at compile time.

My code is

class Q(T)
{
	static auto foo()
	{
		static if (T is A)
		{
                     ...
		}
		static assert(0, "error");
	}
}

and get the error "cannot interpret A at compile time" on the
static if line.

A is an interface.

I simply want to determine if a type is derived from another type
at compile time.
January 23, 2014
On Thursday, 23 January 2014 at 16:21:39 UTC, Frustrated wrote:
> 		static if (T is A)

Try:

static if(is(T : A)) {}


The is() thingy is different than the is operator. T:A means "T implicitly converts to A", so if T is a class implementing interface A, that would pass.

There's also is(T == A) if you want a more specific check, as well as IIRC 5 other forms of the is() thing which get weirder but all do a specific task.
January 23, 2014
Yes, I that is what I tried initially but the error was  due to
that static if.

Not sure why

but

		static if (is(T : A))
		{
                      ...
		}
		static assert(0, "error");


doesn't work as the assert is called no matter what. Initially I
forgot to return the value after changing the code but that
doesn't matter.

Had to change it to


		static if (is(T : A))
		{
                      ...
                      return ...;
		} else
		   static assert(0, "error");
                 return null;

I guess because return is not "static" in some sense.
January 23, 2014
On Thursday, 23 January 2014 at 16:40:49 UTC, Frustrated wrote:
> Yes, I that is what I tried initially but the error was  due to
> that static if.
>
> Not sure why
>
> but
>
> 		static if (is(T : A))
> 		{
>                       ...
> 		}
> 		static assert(0, "error");
>
>
> doesn't work as the assert is called no matter what. Initially I
> forgot to return the value after changing the code but that
> doesn't matter.

As it should be. That static assert gets compiled unconditionally, thus asserts.

> Had to change it to
>
>
> 		static if (is(T : A))
> 		{
>                       ...
>                       return ...;
> 		} else
> 		   static assert(0, "error");
>                  return null;
>
> I guess because return is not "static" in some sense.

else is the correct thing to do here. Otherwise you could have put a runtime assert(0) there, i.e.:

static if (is(T : A))
{
    return "All is good";
}
assert(0, "This should never happen!");