On 03/18/12 15:37, Dmitry Olshansky wrote: > On 18.03.2012 5:23, Manu wrote: >> The virtual model broken. I've complained about it lots, and people >> always say "stfu, use 'final:' at the top of your class". >> >> That sounds tolerable in theory, except there's no 'virtual' keyword to >> keep the virtual-ness of those 1-2 virtual functions I have... so it's >> no good (unless I rearrange my class, breaking the logical grouping of >> stuff in it). >> So I try that, and when I do, it complains: "Error: variable >> demu.memmap.MemMap.machine final cannot be applied to variable", >> allegedly a D1 remnant. >> So what do I do? Another workaround? Tag everything as final individually? >> >> My minimum recommendation: D needs an explicit 'virtual' keyword, and to >> fix that D1 bug, so putting final: at the top of your class works, and >> everything from there works as it should. > > Following this thread and observing that you don't trust optimizer and > compiler in many cases or have to double check them anyway, I have a > suggestion: do virtual dispatch by hand via func-pointer table and use > structs. > > I'm serious, with a bit of metaprogramming it wouldn't be half bad, and as a > bonus you don't have to pay for a monitor field per object as classes do, and > in general less compiler magic to keep track of. You also gain the ability to > fine tune their layout, the performance maniac side of yours must see the > potential it brings :)
I was going to suggest the very same thing - but there are (at least) two problems with that approach: 1) pass-by-value -- it's dangerous, ugly to work-around (and compiler bugs don't help, like the one where just having a "this(this)" causes problems); the workarounds also have compiler/ABI issues (like the 'File' case posted in D.learn some time ago, or GDC not passing/returning the pseudo-refs in registers) 2) no inheritance. ie 'struct A{}; struct B{A super; alias super this;}' cannot be written as just 'struct B:A {}' - which would not be just syntax sugar, but also allow (more) implicit conversions, (explicit) function overrides etc. So - yes, D structs should be enough for everything, but right now they're still missing some required basic features. Ideally "class" would just be sugar, and everything should be expressible using just structs - obviously in a much more verbose, but 100% compatible way (incl vtables, monitors etc) After all, real programmers don't use classes. :) artur