Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
August 11, 2012 Check whether a type is a instantiated by a template struct | ||||
---|---|---|---|---|
| ||||
So the struct is defined as: struct S(T) { } template isS(T) { // ... } static assert(isS(S!float)); static assert(!isS(float)); There may be some nasty ways using fullQualifiedName!T and so on but I guess there is a better way, isn't it? |
August 11, 2012 Re: Check whether a type is a instantiated by a template struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Henning Pohl | On Saturday, 11 August 2012 at 18:51:36 UTC, Henning Pohl wrote:
> So the struct is defined as:
>
> struct S(T) {
> }
>
> template isS(T) {
> // ...
> }
>
> static assert(isS(S!float));
> static assert(!isS(float));
>
> There may be some nasty ways using fullQualifiedName!T and so on but I guess there is a better way, isn't it?
struct S(T) {}
template isS(T : S!U, U) {
enum isS = true;
}
template isS(T) {
enum isS = false;
}
static assert(isS!(S!float));
static assert(!isS!float);
|
August 11, 2012 Re: Check whether a type is a instantiated by a template struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jakob Ovrum | On Saturday, 11 August 2012 at 18:56:30 UTC, Jakob Ovrum wrote:
> struct S(T) {}
>
> template isS(T : S!U, U) {
> enum isS = true;
> }
>
> template isS(T) {
> enum isS = false;
> }
>
> static assert(isS!(S!float));
> static assert(!isS!float);
Same idea, but doing it with just one template and using static ifs...
struct S(T) {}
template isS(T) {
static if(is(T _ : S!U, U))
enum isS = true;
else
enum isS = false;
}
static assert(isS!(S!float));
static assert(!isS!float);
|
August 11, 2012 Re: Check whether a type is a instantiated by a template struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Cain | On Saturday, 11 August 2012 at 19:06:22 UTC, Chris Cain wrote:
>
> Same idea, but doing it with just one template and using static ifs...
>
> struct S(T) {}
>
> template isS(T) {
> static if(is(T _ : S!U, U))
> enum isS = true;
> else
> enum isS = false;
> }
>
> static assert(isS!(S!float));
> static assert(!isS!float);
Thank you two. Did not know about the great abilities of is.
|
August 11, 2012 Re: Check whether a type is a instantiated by a template struct | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Cain | On Saturday, 11 August 2012 at 19:06:22 UTC, Chris Cain wrote:
> Same idea, but doing it with just one template and using static ifs...
>
> struct S(T) {}
>
> template isS(T) {
> static if(is(T _ : S!U, U))
> enum isS = true;
> else
> enum isS = false;
> }
>
> static assert(isS!(S!float));
> static assert(!isS!float);
I usually prefer overloading for this particular kind of template because of the restriction that is() expressions may only introduce symbols when used in static-if statements. I think the if(blah) a = true; else a = false; pattern is worth avoiding as it leaves a bad taste in the mouth of many programmers.
|
Copyright © 1999-2021 by the D Language Foundation