digitalmars.D - Struct multiple inheritance - another solution
- Basile.B (50/50) Nov 27 2015 I've read latest months several related topics (multiple alias
I've read latest months several related topics (multiple alias
this, super struct, etc). But the problem is that these solutions
still differ from a real interface and they don't solve the
problem of casting the interface at run-time (with arbitrary
parameters).
I'll expose another approach.
Let's take the following declarations:
```
interface I {uint fun(uint a);}
struct S {uint fun(uint a);}
```
The problem will all know is that a structure doesn't allow
multiple inheritance. So even if I and S members are compatible
there is no way to extract an I from a S. The layout of a struct
is different the one from a class: no virtual table. No really, a
struct cannot have a virtual table.
But why the hell should it have one ? What's needed is just to
return an I.
Since I really want an interface, the only way to return an I for
S is that the stuff has to be class.
This is how it would look:
```
class SI : I
{
void patch(void* instance)
{
//set fun_DG.ptr to instance, a pointer to a S.
//set fun_DG.funcptr to address in memory of S.fun
}
uint delegate(uint) fun_DG;
uint fun(uint a)
{
return fun_DG(a);
}
}
```
Ok, but how this class has to be declared ? Should it be written
for each struct and for each interface I'd like to extract from a
struct ?
Fortunately no, D has metaprogramming features so we can imagine
a simple function template that returns a string to mix, this
string representing the class that implements an interface for a
struct containing the methods that match to the interface.
And this works:
http://dpaste.dzfl.pl/50a8a7aa1267
And this is almost usable, except for the additional
```
void patch(void* instance);
```
that has to be added to each interface.
Nov 27 2015








Basile.B <bb.temp gmx.com>