auto ref add(V)(auto ref V v1, auto ref V v2);

// default this(this)
Vec3f vec1;

// accepts both lvalues and rvalues
auto res = add(vec1, Vec3f(1, 2, 3.14));

auto ref produces template bloat. That is no real solution for the rvalue ref problem. But there is (more or less) a workaround:

----
import std.stdio;
import std.algorithm : sum;

struct Matrix4x4 {
        private Matrix4x4* _ref;
        
        float[16] values = [
                1, 0, 0, 0,
                0, 1, 0, 0,
                0, 0, 1, 0,
                0, 0, 0, 1
        ];
        
        ref Matrix4x4 byRef() {
                _ref = &this;
                
                return *_ref;
        }
        
        double sum() const {
                return this.values[].sum;       
        }
}

void foo(ref const Matrix4x4 mat) {
        writeln("foo: ", mat.sum);
}

void main() {
        Matrix4x4 m;
        foo(m);
        foo(Matrix4x4().byRef);
}
----

Reply via email to