完美转发D?

时间:2011-10-31 00:15:51

标签: d perfect-forwarding

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

当然不起作用,因为它无法处理refinoutinoutconst - 方法,pure - ity,nothrow等......它还限制了值与r值一起使用的方式。

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

1 个答案:

答案 0 :(得分:3)

你的幼稚方法可以改进,虽然它仍然不完美:

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

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