On Tue, 18 Nov 2008 17:17:36 +0300, Michel Fortin
<[EMAIL PROTECTED]> wrote:
On 2008-11-17 13:56:55 -0500, Harry Vennik <[EMAIL PROTECTED]> said:
Hi,
One of the things D claims is that it eliminates the need for IDL. And
yeah, it does a lot in that direction, but I found something that's
missing while trying to actually implement some sense of RPC...
To get a good view of an interface that can be used to construct the
necessary stub code, you need to have a typed vtable. And D almost
provides it... You can get the untyped vtable, you can get a typed list
of virtual function overloads by name, and you can get the names of all
interface members... So you can get all what's needed, except that
there is no way to know the vtable index of a member function!!!
My proposal to fix this is to allow an expression like:
__traits(getVirtualFunctions, T) // no second argument!
where T is an interface or class type (or an expression of such a
type). Such an expression should then return all virtual member
functions in vtable order, thus making it possible to relate the
function itself to its vtable index.
Personally, I had to work around the same problem in the D/Objective-C
bridge and thus I could probably simplify a few things by having this,
except that what I need in my case is always the vtable index of a
particular function. I guess it could be implemented from the above
__traits syntax, but I'd wish for a simpler solution to my problem, such
as:
__traits(getVTableIndex, T.foo);
along with a way to check if a function is virtual, possibly by checking
they're not final:
static if (is(T.foo == final)) ...;
This way I could build a pointer template-struct to a virtual member
function (without knowing the target object in advance as with
delegates).
What if class T has multiple foo() overloads, half of which are virtual
and half are not?