Different class template args to generate same template instance?

Nick Sabalausky a at a.a
Mon Nov 2 14:12:55 PST 2009


"downs" <default_357-line at yahoo.de> wrote in message 
news:hcnjit$4na$1 at digitalmars.com...
> Nick Sabalausky wrote:
>> "BCS" <none at anon.com> wrote in message
>> news:a6268ffc3898cc29d1f554dfe2 at news.digitalmars.com...
>>> Hello Nick,
>>>
>>>
>>>> So...is there any trickery I
>>>> could do so that SubFoo!("sam") and SubFoo!("sam", "human") would
>>>> resolve to the same subclass of Foo?
>>> Make a SubFoo!(char[] s) that does your logic and if it passesa alises 
>>> to
>>> SubFoo!(s,"")
>>>
>>>
>>
>> I'm not sure I understand...?
>>
>>
>
> I think what he's trying to say is
>
> template SubFoo!(char[] name, char[] type) {
>  static if (name == "sam" && (type == "human" || type == "")) alias 
> _SubFoo!("sam", "human") SubFoo;
>  /* etc */
> }

Ahh! Thanks all, that works perfectly:

-------------------------------------------------------------
module foo;

class Foo
{
    protected char[] _n="Plain Foo";
    char[] n()
    {
        return _n.dup;
    }
}

template SubFoo(char[] name, char[] type="")
{
    static if (name == "sam" && (type == "human" || type == ""))
        alias _SubFoo!(name, "human") SubFoo;
    else static if(
        (name == "zoe" && type == "human") ||
        (name == "zoe" && type == "starship")
    )
        alias _SubFoo!(name, type) SubFoo;
    else static if(name == "zoe" && type == "")
        static assert(false, "Name '"~name~"' is ambiguous");
    else
        static assert(false, "Invalid name/type: '"~name~"' '"~type~"'");
}

private class _SubFoo(char[] name, char[] type) : Foo
{
    static if(name == "sam" && type == "human")
        this() { _n = "sam human"; }
    else static if(name == "zoe" && type == "human")
        this() { _n = "zoe human"; }
    else static if(name == "zoe" && type == "starship")
        this() { _n = "zoe starship"; }
    else
        static assert(false, "Invalid name/type: '"~name~"' '"~type~"'");
}
-------------------------------------------------------------
module main;
import tango.io.Stdout;
import foo;

void main()
{
    auto f  = new Foo();
    auto s_ = new SubFoo!("sam");
    auto sh = new SubFoo!("sam", "human");
    auto zh = new SubFoo!("zoe", "human");
    auto zs = new SubFoo!("zoe", "starship");

    // ERROR: Name 'zoe' is ambiguous
    //auto z_ = new SubFoo!("zoe");

    // ERROR: Invalid name/type 'dummy' 'dude'
    //auto d_ = new SubFoo!("dummy", "dude");

    Stdout.formatln("f : {}", f.n);  // OUT: f : Plain Foo
    Stdout.formatln("s_: {}", s_.n); // OUT: s_: sam human
    Stdout.formatln("sh: {}", sh.n); // OUT: sh: sam human
    Stdout.formatln("zh: {}", zh.n); // OUT: zh: zoe human
    Stdout.formatln("zs: {}", zs.n); // OUT: zs: zoe starship
}
-------------------------------------------------------------





More information about the Digitalmars-d-learn mailing list