detecting classes, structs, arrays in templates

Luke J. West luke at west.me.uk
Sun Jan 23 06:27:09 PST 2011


Thanks for that bearophile - I'll get myself subscribed right away.

Bye for now,

Luke

On Sun, 23 Jan 2011 09:17:05 -0500, "bearophile"
<bearophileHUGS at lycos.com> said:
> 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