Forward declarations of template specilizations.

Ryan Bloomfield _sir_maniacREMOVE_ME at yahoo.com
Sun Nov 16 12:52:21 PST 2008


Bill Baxter Wrote:

> On Sun, Nov 16, 2008 at 5:14 PM, Christian Kamm
> <kamm-incasoftware at removethis.de> wrote:
> >> I have an interesting issue, that makes me curious on how D handles it.
> >>
> >> (Traits template code)
> >
> > You cannot spread out template specializations across modules. If you define
> >
> > template Trait(T : S); in a.d and
> > template Trait(T : C); in b.d and try to use
> > alias Trait!(S) sinst; in use.d, you'll get
> > Error: a.Trait(T : S) at a.d(3) conflicts with b.Trait(T : C) at b.d(3)
> >
> > because the two Traits live in separate scopes. This makes C++ style trait
> > templates just not work in D.
> >
> > Does anyone know an equivalent?
> 
> I think what Ryan said there is the general approach you have to take.
> Don't specialize the traits template, but rather pass in a whole new
> template as an alias parameter to the main template.
> 
> This would be a good thing to add here:
> http://www.prowiki.org/wiki4d/wiki.cgi?PortingFromCxx
> Is there some canonical example of where you use specialized traits
> templates in C++?  Or is this maybe a more general issue, like porting
> ADL code in C++.
> 
> Not traits templates, but another ADL example is how you see IO done
> often in C++.  With overloads for some common function like
> "write(Stream& o, ModuleSpecificType& val)".  This pattern doesn't
> translate directly to D either.  Suggestions?
> 
> --bb

I think can understand why it works the way it does. ADL does sound a bit too complex(being hard to understand it's side-effect) to add to D.

Polymorphism could be used as an alternative(the library class uses an interface to interact with the data), but that requires run-time overhead, but necessary anyway if polymorphism is involved in the data type.

If I change the Traits from a template into a class template makes it easier to pass(no alias argument), the major difference is that the traits must be passed whenever it is overridden.

According to http://www.digitalmars.com/d/1.0/templates-revisited.html(under "Template Parameters") a template can be passed as a template argument.  How does one do that? The compiler (gdc) give an error when I try to pass a template like a type(complains it isn't a type).

Ryan




More information about the Digitalmars-d mailing list