rvalues -> ref (yup... again!)
Rubn
where at is.this
Sun Mar 25 00:43:01 UTC 2018
On Saturday, 24 March 2018 at 23:03:36 UTC, John Colvin wrote:
> Here is a small proof of concept I made to demonstrate how easy
> it seems to be to use `auto ref` to call a C++ virtual const&
> function without incurring any more copies than would happen
> with the same calls from C++. I'm sure it could be improved a
> lot, but does the basic concept match what you would need?
>
> // D source file:
>
> /// mix this in to your extern(C++) class with a list of the
> functions where you
> /// want to be able to pass rvalues to ref parameters.
> auto rValueRefCalls(Funcs ...)()
> {
> string ret;
> foreach (foo; Funcs)
> ret ~= `extern(D) void ` ~ __traits(identifier, foo) ~
> `(Args ...)(auto ref Args args)
> if (__traits(compiles, (&this.` ~ __traits(identifier, foo)
> ~ `)(args)))
> {
> (&this.foo)(args);
> }`;
>
> return ret;
> }
>
> extern(C++)
> {
> class A
> {
> void foo(const ref int v);
> mixin(rValueRefCalls!foo);
> }
>
> A makeA();
> }
>
> void main()
> {
> int x = 3;
> auto a = makeA();
> a.foo(x);
> a.foo(3);
> }
>
>
> // C++ source file:
>
> #include<cstdio>
>
> class A
> {
> public:
> virtual void foo(const int& v)
> {
> printf("%d\n", v);
> }
> };
>
> A *makeA()
> {
> return new A;
> }
That isn't going to scale to the number of potential functions
that are going to need this. It's going to cause slow compile
speeds and create a bloated binary.
More information about the Digitalmars-d
mailing list