Storing interfaces as void[]
tsbockman
thomas.bockman at gmail.com
Sat Mar 13 19:23:02 UTC 2021
On Saturday, 13 March 2021 at 15:44:53 UTC, frame wrote:
> Maybe I don't get this right but why you don't just use the
> void[] as it is?
>
> void[] mem = [i];
> //...
> return (cast(T[]) mem)[0];
>
> This is how I exchange variable data between DLLs.
That works, and is more elegant than the OP's solution. (And, I
didn't know you could do it that way, so thanks for sharing!)
However, it still adds an unnecessary second level of indirection
for interfaces and classes. The simplest and most efficient
solution is actually this:
auto indirect = cast(void*) i; // i is of type I.
// ...
return cast(I) indirect;
Where `is(I : T*, T) || is(I == interface) || is(I == class)`.
The constraint enforces that all types should be accessed through
exactly one level of indirection, allowing the same code to
handle both reference types and value types with maximum
efficiency.
More information about the Digitalmars-d-learn
mailing list