Идеальная пересылка в D?

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() "идеально" (т.е. не создавая проблем с компиляцией/скопом/etc. проблем на вызывающем сайте)?

Наивный подход

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

конечно, не работает, потому что он не обрабатывает ref, in, out, inout, const-ность метода, pure-ность, nothrow, и т.д. ... и это также ограничивает использование значений с r-значениями.

И я не знаю, как справиться с этими возможными случаями... есть идеи?

6
задан Mehrdad 31 October 2011 в 00:21
поделиться