如何将方法转换为函数?

时间:2016-01-24 03:42:43

标签: d

我编写了一个小辅助函数来模拟C ++的模板扩展语法。

static template unpack(alias f){
  pragma(inline)
  auto into(alias target, Args...)(ref Args args){
    import std.conv;
    enum s = `target(`~iota(Args.length).map!(i=>text(`f(args[`,i,`])`)).join(",")~`)`;
    return mixin(s);
  }
  auto into(alias target, Args...)(Args args){
    return into!(target)(args);
  }
}

可以像这样使用

auto intTuple = unpack!(i => i * 10).into!(tuple)(1,2,3);
//Tuple!(int, int, int)(10, 20, 30)

这可以按预期工作,但如果我需要调用返回ref的方法,我会遇到一些问题。

void test1(T)(ref T t){
  writeln(t);
}
Array!int ai = [1,2,3,4];
unpack!(r => r.front()).into!(test1)(ai[]);

这应该大致翻译为test1(ai[].front());。但它没有编译,因为似乎lambda语法无法处理ref返回值。

所以这个修复了我需要创建一个辅助函数

ref auto cfront(T)(ref T t){
  return t.front();
}

unpack!(cfront).into!(test1)(ai[]);

有没有办法表达

ref auto cfront(T)(ref T t){
  return t.front();
}

作为lambda函数?

或者我可以在UFCS的帮助下以某种方式将.front()方法转换为独立函数吗?

0 个答案:

没有答案