2011-10-31 17 views
6

टीएल; डॉ: आप डी में perfect forwarding कैसे करते हैं?डी में बिल्कुल सही अग्रेषण?


लिंक एक महान व्याख्या है, लेकिन उदाहरण के लिए, मान लीजिए कि मैं इस विधि का उपयोग करते हैं:

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 अल्पसंख्यक, nothrow, आदि से हैंडल नहीं करता ... और यह भी सीमित करता है कि आर-मानों के साथ मूल्यों का उपयोग कैसे किया जा सकता है।

और मुझे नहीं पता कि उन संभावित मामलों को कैसे संभालना है ... कोई विचार?

उत्तर

3

आपका अनुभवहीन दृष्टिकोण पर सुधार किया जा सकता है, हालांकि यह अभी भी सही नहीं है:

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

अब केवल समस्या scope तर्क है।

+1

रुको, 'नोट्रो', 'शुद्ध', 'कॉन्स्ट',' इनआउट ', '@ प्रॉपर्टी', '@ सुरक्षित', और उन सभी अन्य चीजों के बारे में क्या है जो मैं इस समय नहीं सोच सकता? उनमें से प्रत्येक (यहां तक ​​कि '@ संपत्ति') कोड व्यवहार को थोड़ा बदल सकता है, और/या संकलन को रोक सकता है। – Mehrdad

+1

आपको वापसी के रूप में एक ऑटो रेफरी चाहिए, और यदि आपके टेम्पलेट पर विचार है, और फिर भी, मुझे यकीन नहीं है कि यह पर्याप्त है। – deadalnix

+0

@ मेहरदाद: अच्छे अंक, हालांकि शुद्ध आजकल टेम्पलेट्स के लिए अनुमानित है। – dsimcha

संबंधित मुद्दे