6
tl; dr:你如何在D中做perfect forwarding?D完美转发?
链接有一个很好的解释,但是,例如,让我们说我有这样的方法:
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
-ness方法,pure
-ity,nothrow
等...并且还限制了值可以如何与r值一起使用。
我不知道如何处理这些可能的情况......任何想法?
等一下,nothrow','pure','const','inout','@ property','@ safe'和所有其他的事情我现在还想不到?这些(甚至是'@ property')中的每一个都可以稍微改变代码行为,并且/或者防止编译。 – Mehrdad
你需要一个自动引用作为返回,并且如果你的模板需要considition,而且我仍然不确定这是否足够。 – deadalnix
@Mehrdad:好点,尽管现在对模板的推导是纯粹的。 – dsimcha