tl;博士:你如何在D中做perfect forwarding?
该链接有一个很好的解释,但是,例如,假设我有这个方法:
void foo(T)(in int a, out int b, ref int c, scope int delegate(ref const(T)) d)
const nothrow
{
}
如何创建另一个方法bar()
,可以代替foo()
调用该方法,随后“完美地”调用foo()
(即不引入编译/范围/等)。呼叫站点的问题)?
天真的方法
auto bar(T...)(T args)
{
writeln("foo() intercepted!");
return foo(args);
}
当然不起作用,因为它无法处理ref
,in
,out
,inout
,const
- 方法,pure
- ity,nothrow
等......它还限制了值与r值一起使用的方式。
我不知道如何处理这些可能的案例......任何想法?
答案 0 :(得分:3)
你的幼稚方法可以改进,虽然它仍然不完美:
auto ref bar(T...)(auto ref T args)
{
writeln("foo() intercepted!");
return foo(args);
}
现在唯一的问题是scope
个参数。