Struggling trying to use opCast to solve the the interface impl VS the class impl
user1234
user1234 at 12.de
Sat Nov 8 10:47:26 UTC 2025
On Saturday, 8 November 2025 at 10:04:45 UTC, user1234 wrote:
> Following recent discussion in the General group, I had the
> idea to use `opCast` in order to return a specially cooked
> interface instance.
>
> That would not be a decent solution because for example
> `opCast` template func is not virtual but nonetheless I'd like
> to know if this could work...
>
> Only problem is that I cant manage to build the custom
> interface, or more exactly, it is not binary compatible:
Slightly less C-ish and eliminating the recursive opCast, but
still not working (valgrind reports memory errors)
```d
import core.stdc.stdio, core.memory;
interface CanStart
{
void start();
}
class Base : CanStart
{
public void start()
{
puts("object start()");
}
public void interfaceStart()
{
puts("itf start()");
}
T opCast(T)()
{
static if (is(T == CanStart))
{
struct S
{
Base b;
void* f;
}
auto s = cast(S*) GC.malloc(size_t.sizeof*2);
s.b = this; // likely the issue
s.f = (&interfaceStart).ptr;
auto result = *cast(CanStart*) s;
return result;
}
assert(0);
}
}
void main()
{
auto b = new Base;
b.start();
auto cs = cast(CanStart) b;
cs.start();
}
```
Anyone ?
More information about the Digitalmars-d-learn
mailing list