On Monday, 18 January 2016 at 15:36:09 UTC, Manu wrote:
One more time...

Assuming:
void func(const CustomString &s1, const CustomString &s2);
void func(ref const(CustomString) s1, ref const(CustomString) s2);

C++:
  func("hello", "world");

D:
  auto dumb_name = CustomString("hello");
  auto another_dumb_name = CustomString("world");
  func(dumb_name, another_dumb_name);

Does this do what you want?

import std.stdio;

bool isLValue(T)(ref T val) {
    return true;
}

struct CustomString {
    this(string data) {
        this.data = data;
    }

    string data;
    alias data this;
}

void func(ref CustomString s1, ref CustomString s2) {
    writeln(s1);
    writeln(s2);
    s2 = "universe!";
}

pragma(inline, true)
void arFunc(T, V)(auto ref T s1, auto ref V s2) {
    static if(__traits(compiles, isLValue(s1)))
        alias s1L = s1;
    else
        T s1L = s1;

    static if(__traits(compiles, isLValue(s2)))
        alias s2L = s2;
    else
        V s2L = s2;

    func(s1L, s2L);
}


void main() {
    CustomString b = CustomString("world!");
    arFunc(CustomString("Hello"), b);

    writeln("Hello");
    writeln(b);
}

If so, I probably genericize arFunc better so you can just do this:

void funcImpl(ref const(CustomString) s1, ref const(CustomString) s2);
alias func = arFunc!funcImpl;

Reply via email to