tl; dr: Bạn làm cách nào để thực hiện perfect forwarding trong D?Chuyển tiếp hoàn hảo trong D?
Liên kết này có một lời giải thích tuyệt vời, nhưng ví dụ, giả sử tôi có phương pháp này:
void foo(T)(in int a, out int b, ref int c, scope int delegate(ref const(T)) d)
const nothrow
{
}
Làm thế nào để tạo ra một phương pháp khác, bar()
, có thể được gọi là thay foo()
, mà sau đó gọi foo()
"hoàn hảo" (nghĩa là không giới thiệu các vấn đề biên dịch/phạm vi/v.v. tại trang web gọi điện)?
Cách tiếp cận ngây thơ
auto bar(T...)(T args)
{
writeln("foo() intercepted!");
return foo(args);
}
tất nhiên không hoạt động bởi vì nó không xử lý các ref
, in
, out
, inout
, các const
-ness của phương pháp này, pure
-ity, nothrow
, vv ... và nó cũng giới hạn cách các giá trị có thể được sử dụng với giá trị r.
Và tôi không biết cách xử lý những trường hợp có thể xảy ra ... bất kỳ ý tưởng nào?
Chờ đợi, còn về 'nothrow',' pure', 'const',' inout', '@ property',' @ safe', và tất cả những thứ khác tôi không thể nghĩ ra vào lúc này? Mỗi một trong số đó (ngay cả '@ property') cũng có thể thay đổi hành vi mã, và/hoặc ngăn chặn việc biên dịch. – Mehrdad
Bạn cần một ref tự động là trả về, và nếu xem xét đến mẫu của bạn, và vẫn còn, tôi không chắc chắn điều này là đủ. – deadalnix
@Mehrdad: Điểm tốt, mặc dù tinh khiết được suy ra cho các mẫu hiện nay. – dsimcha