Different class template args to generate same template instance?

Nick Sabalausky a at a.a
Mon Nov 2 14:16:20 PST 2009


"Nick Sabalausky" <a at a.a> wrote in message 
news:hcnlh7$msb$1 at digitalmars.com...
> "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
> }
> -------------------------------------------------------------
>

Oops, just realized that main doesn't necessarily prove that the 
SubFoo!("sam") and SubFoo!("sam", "human") are the same types. But this 
passes fine, so all looks ok, thanks again! :

static assert(is( SubFoo!("sam") == SubFoo!("sam", "human") ));




More information about the Digitalmars-d-learn mailing list