Andrei Alexandrescu wrote: > Lars Ivar Igesund wrote: >> Andrei Alexandrescu wrote: >> >>> Lars Ivar Igesund wrote: >>>> No, you misunderstand. I said safely call, not exceptionally >>>> efficient. To me a virtual call would be acceptable. However, at >>>> least in my cases, there would normally not be more than one >>>> imlemented interface and such it would be a tiny vtable. >>> Ok, so the scope is reducing nicely. We now have a few problems to >>> solve (some details glossed over for simplicity). >>> >>> a) Get from void* to the TypeInfo that's typing that void*. This >>> will involve a search as the void* could point really anywhere, >>> including untyped memory. So we have a core function: >>> >>> TypeInfo fromAddress(void * p); >>> >>> b) Starting from a TypeInfo, get an interface in case the >>> underlying struct implements that interface: >>> >>> Object TypeInfo.QueryInterface(TypeInfo someInterface); >>> >>> c) Finally, given a void* and an interface, invoke a method of that >>> interface: >>> >>> T structCast!(Interface)(p).method(arguments); >> >> Since you used template lingo, it looks a bit like compile time >> functionality, but yes, very close now :) >> >> Also (I keep forgetting to mention important details) - I typically >> see this used in variadic functions, such that the typeinfo already >> is there. > > But what are you ultimately trying to accomplish, and why do you must > lose all static information since it was just available to the caller? > Isn't there a simpler way to achieve your goal (e.g. using the new > variadics)? You are essentially asking for full-blown runtime scripting > for all structs.
Sorry; new variadics? -- Lars Ivar Igesund blog at http://larsivi.net DSource, #d.tango & #D: larsivi Dancing the Tango
