| Thread overview | ||||||
|---|---|---|---|---|---|---|
|
January 23, 2014 Compare type with another at CT | ||||
|---|---|---|---|---|
| ||||
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 Re: Compare type with another at CT | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Frustrated | 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 Re: Compare type with another at CT | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | 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 Re: Compare type with another at CT | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Frustrated | 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!"); | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply