2011-10-31 38 views
6

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?

Trả lời

3

cách tiếp cận ngây thơ của bạn có thể được cải thiện khi, mặc dù nó vẫn chưa hoàn hảo:

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

Bây giờ vấn đề chỉ là scope đối số.

+1

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

+1

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

+0

@Mehrdad: Điểm tốt, mặc dù tinh khiết được suy ra cho các mẫu hiện nay. – dsimcha

Các vấn đề liên quan