我编写了一个小辅助函数来模拟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()
方法转换为独立函数吗?