detecting classes, structs, arrays in templates

bearophile bearophileHUGS at lycos.com
Sun Jan 23 06:17:05 PST 2011


Luke J. West:

> Hi,
> 
> I want to specialize a template function - call it print() - for three
> cases: classes, structs and arrays. Ideally I'd like something that
> looks 'functional' like a proper specialization, but perhaps I need to
> use "static if". I'm still at the beginning of my journey with D so I'd
> be grateful for any pointers (sorry - that's a terrible pun). Perhaps
> there's a corner of the D2 docs I've glossed over.

I suggest you to ask such questions in the D.learn newsgroup.
Here are two possible implementations:

import std.stdio: writeln;
import std.traits: isArray;

void print(T)(T x) if (!isArray!T && !is(T == class) && !is(T == struct)) {
    writeln("general");
}

void print(T)(T[] x) {
    writeln("Dynamic array or fixed-sized array");
}

void print(T)(T x) if (is(T == class)) {
    writeln("Class instance");
}

void print(T)(T x) if (is(T == struct)) {
    writeln("Struct instance");
}

void print2(T)(T x) {
    static if (isArray!T)
        writeln("Dynamic array or fixed-sized array");
    else static if (is(T == class))
        writeln("Class instance");
    else static if (is(T == struct))
        writeln("Struct instance");
    else
        writeln("general");
}


class C {}
struct S {}

void main() {
    C c;      // some class
    S s;      // some struct
    int[4] a; // a fixed-sized array
    int p;    // a primitive type

    print(a);
    print(p);
    print(c);
    print(s);
    writeln();

    print2(a);
    print2(p);
    print2(c);
    print2(s);
}

Bye,
bearophile


More information about the Digitalmars-d mailing list