May 18, 2008 Re: class template specialization and inheritance | ||||
|---|---|---|---|---|
| ||||
Bill Baxter Wrote: > > For my programming purpose, the important thing is that C(TT:A(T)) is a specialization of C(T), but the suggested C(TT:A(T),T) is _not_. > > According to the documentation D thinks it is. Do you have evidence to the contrary? Thanks for your answer, Bill. I am quite new to D, and it seems that I got this quite wrong. I believed that for a template to be a specialization of another, the number of template parameters must be the same. With this new insight the code of my original problem changes to //begin code example import std.stdio; class A(T) { } class B(T) : A!(T) { } class C(T) { static void tellMe() { writefln("generic."); } } class C(TT:A!(T),T) { static void tellMe() { writefln("TT is the same as or derived from A!(T)."); } } void main() { C!(A!(int)).tellMe(); C!(B!(int)).tellMe(); C!(int).tellMe(); } //end code example which still gives (using DMD 2.008) T is the same as or derived from A!(TT). generic. generic. where the second line should be "T is the same as or derived from A!(TT)." in my opinion. Am I still doing something wrong, or is this a bug? > Sadly the argument deduction (IFTI) implementation is not very complete. > It only works in very specific situations. Thats bad. I'm writing heavily templated generic code, currently in C++ with its sometimes very painful template syntax. I hoped that I could switch to D. But an incomplete argument deduction implementation is worse than the C++ template syntax. ~mki | ||||
June 13, 2008 Re: class template specialization and inheritance | ||||
|---|---|---|---|---|
| ||||
Posted in reply to mki | mki wrote: > Bill Baxter Wrote: > >>> For my programming purpose, the important thing is that C(TT:A(T)) is a specialization of C(T), but the suggested C(TT:A(T),T) is _not_. >> According to the documentation D thinks it is. Do you have evidence to the contrary? > > Thanks for your answer, Bill. > I am quite new to D, and it seems that I got this quite wrong. > I believed that for a template to be a specialization of another, the number of template parameters must be the same. > > With this new insight the code of my original problem changes to > > //begin code example > import std.stdio; > > class A(T) { } > > class B(T) : A!(T) { } > > class C(T) { > static void tellMe() { > writefln("generic."); > } > } > > class C(TT:A!(T),T) { > static void tellMe() { > writefln("TT is the same as or derived from A!(T)."); > } > } > > void main() { > C!(A!(int)).tellMe(); > C!(B!(int)).tellMe(); > C!(int).tellMe(); > } > //end code example > > which still gives (using DMD 2.008) > > T is the same as or derived from A!(TT). > generic. > generic. > > where the second line should be "T is the same as or derived from A!(TT)." in my opinion. > Am I still doing something wrong, or is this a bug? > >> Sadly the argument deduction (IFTI) implementation is not very complete. It only works in very specific situations. > > Thats bad. > I'm writing heavily templated generic code, currently in C++ with its sometimes very painful template syntax. I hoped that I could switch to D. > > But an incomplete argument deduction implementation is worse than the C++ template syntax. > > ~mki Seem my comments to your bug report. I don't think it's a bug, but rather an enhancement request, but it's hard to say for sure since (IMO) the spec is somewhat murky on matters of template specialization. There is a workaround there which should work for what you want, unless you have some other requisite you didn't mention. -- Bruno Medeiros - Software Developer, MSc. in CS/E graduate http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply