【问题标题】:Perfect forwarding in D?D中的完美转发?
【发布时间】:2011-10-31 00:15:51
【问题描述】:

tl;dr:你在 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-ness 方法、pure-ity、@987654333 @ 等...它还限制了值如何与 r 值一起使用。

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

【问题讨论】:

    标签: d perfect-forwarding


    【解决方案1】:

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

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

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

    【讨论】:

    • 等等,nothrowpureconstinout@property@safe 以及其他我暂时想不到的东西呢?每一个(甚至是@property)都可以稍微改变代码行为,和/或阻止编译。
    • 您需要一个自动引用作为返回值,以及您的模板的 if 条件,但我仍然不确定这是否足够。
    • @Mehrdad:好点,虽然现在推断模板是纯的。
    • @dsimcha :您需要测试 foo 是否可以使用 args 调用。通过值传递给 bar 的东西可以通过引用传递给 foo。但是更改后的值只会在 bar 中可见,这不是我们想要的。请注意,我不确定,可能是错的。
    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 2017-08-05
    • 1970-01-01
    • 2011-04-05
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多