Thread overview
Check whether a type is a instantiated by a template struct
Aug 11, 2012
Henning Pohl
Aug 11, 2012
Jakob Ovrum
Aug 11, 2012
Chris Cain
Aug 11, 2012
Henning Pohl
Aug 11, 2012
Jakob Ovrum
August 11, 2012
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
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
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
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
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.