2011-10-31 20 views
6

tl; dr: D perfect forwarding'u nasıl yapıyorsunuz?D'de mükemmel yönlendirme?


bağlantı büyük bir açıklaması olduğunu ancak örneğin, bu reklam bu yöntemi var diyelim: Ben başka bir yöntem nasıl oluşturabilirim

void foo(T)(in int a, out int b, ref int c, scope int delegate(ref const(T)) d) 
    const nothrow 
{ 
} 

, bar(), foo() yerine çağrılabilir, daha sonra foo() "mükemmel" (yani arama sitesinde derleme/kapsam/etc.

o ref, in, out, inout, yöntemin const -lık, pure -ity, nothrow vb işlenmemesi nedeniyle elbette

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

çalışmıyor naif yaklaşım ... ve ayrıca değerlerin r değerleri ile nasıl kullanılacağını sınırlar.

Ve bu olası durumların nasıl ele alınacağını bilmiyorum ... herhangi bir fikir?

cevap

3

Kişisel naif yaklaşım hala mükemmel değil ama, üzerine geliştirilebilir:

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

Şimdi tek sorun scope argümanlar olduğunu.

+1

Bekle, nothrow', 'pure',' const', 'inout',' @ property', '@ safe' ve ben şu anda düşünemiyorum bütün diğer şeylerin' ne olacak? Bunların her biri ('mülk' bile) kod davranışını biraz değiştirebilir ve/veya derlemeyi önleyebilir. – Mehrdad

+1

Sen Şablonunuza bir oto dönüşü gibi ref, ve considition eğer ihtiyaç ve yine de bu yeterli olduğundan emin değilim. – deadalnix

+0

@Mehrdad: İyi puanlar, günümüzde şablonlar için saf olmasına rağmen. – dsimcha

İlgili konular