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-значениями.
И я не знаю, как справиться с этими возможными случаями... есть идеи?