2009-02-04 9 views
5

यह मेरा पहला प्रश्न है, इस साइट को पाने में खुशी हुई।जेनेरिक पैरामीटर प्रकार के लिए सूचक कैसे डालें?

मेरा प्रश्न डेल्फी 200 9 में नई जेनरिक फीचर के साथ सौदा करता है। असल में मैंने मौजूदा हैश मैप कार्यान्वयन के लिए जेनेरिक रैपर क्लास लिखने की कोशिश की। मौजूदा कार्यान्वयन स्टोर (स्ट्रिंग, पॉइंटर) जोड़े, इसलिए रैपर वर्ग में मुझे जेनेरिक पैरामीटर प्रकार टी और पॉइंटर प्रकार और इसके विपरीत के बीच कास्ट करना होगा। (मूल्य: टी)

type THashMap <T : class> = class 
private 
    FHashList : THashList; 
    ... 

end; 

मैं इस तरह के कलाकारों के बारे में सोचा

Value := (TObject (Ptr)) as T 

लेकिन यह काम नहीं करता। संकलक मुझे 'ऑपरेटर इस ऑपरेंड प्रकार पर लागू नहीं है' बताता है।

किसी के पास कुछ संकेत हैं? आपका अग्रिम रूप से बोहोत धन्यवाद।

उत्तर

10

आपको जेनेरिक प्रकार पैरामीटर प्रकार के स्थान का पता लेने की आवश्यकता है, फिर वांछित प्रकार के लिए इस पते को पॉइंटर पर टाइप करें, और उसके बाद इस पॉइंटर को डिफरेंस करें और int ओ परिणामी स्थान। उदाहरण के लिए:

PObject(@Value)^ := Ptr; 

कारण तुम सिर्फ प्रकार टी, जहां टी स्वेच्छापूर्ण है के एक मूल्य टाइपकास्ट नहीं कर सकते, कि संकलक टी के आकार का पता नहीं होता है; आम तौर पर, गैर-संख्यात्मक टाइपकास्ट केवल वैल्यू को उसी प्रकार के रूप में परिवर्तित कर सकते हैं जो समान आकार के होते हैं।

दुर्भाग्यवश, संकलक यह समझने के लिए पर्याप्त स्मार्ट नहीं है कि कक्षा-प्रकार की बाधा का मतलब है कि टी को सूचक के समान आकार के रूप में गारंटी दी जाती है।

इसके अलावा, मौजूदा डेल्फी 200 जेनिक्स के साथ पैरामीटर प्रकार टाइप करने के लिए पॉइंटर्स बनाने के साथ कोई समस्या है। जेनेरिक संकेत संकलक द्वारा समर्थित नहीं हैं, लेकिन संकलक परमिट इस वाक्य रचना के अंदर कक्षाएं:

type 
    C<T> = class 
    type 
    PT = ^T; // UNSUPPORTED! 
    end; 

यह कुछ परिदृश्यों के लिए काम कर सकते हैं - और अपने विशिष्ट समस्या के लिए सहायक हो सकता है - लेकिन यह केवल दुर्घटना से काम करता है और नहीं है आम तौर पर समर्थित है। अपने जोखिम पार इस्तेमाल करें।

0

इस प्रयास करें:

Value := TObject (Ptr) 

कोई ज़रूरत नहीं सामान्य वर्ग प्रकार चर को TObject बताए के रूप में, कास्ट करने के वैध है :)

लेकिन मैं कारण नहीं जानता कि क्यों तुम T उपयोग नहीं कर सकते पहली जगह में कास्टिंग के लिए ...

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

  • कोई संबंधित समस्या नहीं^_^