6

tl; dr:你如何在 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 值一起使用。

而且我不知道如何处理这些可能的情况......有什么想法吗?

4

1 回答 1

3

您的幼稚方法可以改进,尽管它仍然不完美:

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

现在唯一的问题是scope争论。

于 2011-10-31T03:30:47.597 回答