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

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

6 голосов
/ 31 октября 2011

tl; dr: Как вы делаете совершенную пересылку в D?


Ссылка имеет отличное объяснение, но, например, допустим, у меня есть этот метод:1006 *

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 -ность метода, pure -ity, nothrow и т. Д. ... и это также ограничивает использование значений со значениями r.

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

1 Ответ

3 голосов
/ 31 октября 2011

Ваш наивный подход может быть улучшен, хотя он все еще не совершенен:

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

Теперь единственная проблема - scope аргументы.

...