On Saturday, 4 November 2023 at 14:21:49 UTC, Paul Backus wrote:
[...]
`extern(C++)` functions use C++ name mangling, which includes
the types of the parameters in the mangled name. However, since
C++ does not have a built-in slice type like D's `T[]`, there
is no valid C++ mangling for a D slice. Because of this, it is
impossible to compile an `extern(C++)` function that has a D
slice as a parameter.
As a workaround, you can convert the slice to a `struct`:
[...]
I use another workaround myself:
```d
extern (C++) struct List(T) { // or extern (C)
T[] self;
alias self this;
}
extern (C++) void hello(List!ubyte arg) {
import std.stdio;
writeln(arg);
}
```
but it means adding a lot of edge cases to the mixins I use for
bindings while showing that C++ can express D arrays.
(translated to
```c++
template <typename T>
struct List final
{
_d_dynamicArray< T > self;
List()
{
}
};
extern void hello(List<uint8_t > arg);
```
)