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