digitalmars.D - Another use-case for multiple alias this
- Andrej Mitrovic (57/57) Aug 05 2013 I've noticed something that's happening in many D libraries, some data
I've noticed something that's happening in many D libraries, some data structures are constantly being reinvented. The classic example is the Rectangle struct. For example, CairoD defines a Rect struct, but so do other libraries like DGui, Qtd, and practically any library which has to deal with drawing something on the screen. The problem when using multiple libraries, is that you end up having a hard time interacting with these libraries when you have to take care which exact Rect structure you can pass to some library function, for example: ----- // library code void fooLibDrawRect(Rect rect); // actually takes foo.rect void barLibDrawRect(Rect rect); // actually takes bar.rect // user code import foo; import bar; void main() { fooLibDrawRect(Rect(...)); // usually a symbol error if there's 2 different Rect definitions } ----- So the current fix for this is to use either explicit symbol lookup or to introduce aliases: ----- import foo; import bar; alias FooRect = foo.Rect; alias BarRect = foo.Rect; void main() { fooLibDrawRect(FooRect(...)); barLibDrawRect(BarRect(...)); } ----- If we had multiple alias this support, then the user could introduce his own Rect struct that wraps all the other Rect structs to make using the actual libraries much simpler: ----- struct Rect // { int x, y, width, height; /* These might do conversions if necessary, or they could use a static cast of the "this" object */ property auto getFooRect() { return foo.Rect(...); } property auto getBarRect() { return bar.Rect(...); } alias getFooRect this; alias getBarRect this; } void main() { fooLibDrawRect(Rect(...)); // works barLibDrawRect(Rect(...)); // also works } ----- I think this would be a major selling point for D. And in fact multiple alias this is a feature we've practically all agreed on, but what's holding it from being finally implemented?
Aug 05 2013