2011-10-31 35 views
6

tl; dr:你如何在D中做perfect forwardingD完美转发?


链接有一个很好的解释,但是,例如,让我们说我有这样的方法:

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); 
} 
当然

不起作用,因为它不处理refinoutinoutconst -ness方法,pure -ity,nothrow等...并且还限制了值可以如何与r值一起使用。

我不知道如何处理这些可能的情况......任何想法?

回答

3

你幼稚的做法可以改进,但它仍然不是很完美:

auto ref bar(T...)(auto ref T args) 
{ 
    writeln("foo() intercepted!"); 
    return foo(args); 
} 

现在唯一的问题是scope参数。

+1

等一下,nothrow','pure','const','inout','@ property','@ safe'和所有其他的事情我现在还想不到?这些(甚至是'@ property')中的每一个都可以稍微改变代码行为,并且/或者防止编译。 – Mehrdad

+1

你需要一个自动引用作为返回,并且如果你的模板需要considition,而且我仍然不确定这是否足够。 – deadalnix

+0

@Mehrdad:好点,尽管现在对模板的推导是纯粹的。 – dsimcha