2011-03-17 10 views
9

मैं इस तरह एक वर्ग है:मैं सामान्य प्रकार के आधार पर सूचक कैसे घोषित कर सकता हूं?

type A = class 
    procedure<T> DoStuff(tPtr: ^T); 
end; 

लेकिन जब मैं संकलन करने की कोशिश, डेल्फी मुझे इस त्रुटि देता है:

[DCC Error] RPML.pas(57): E2029 Identifier expected but '^' found 

मैं एक डेल्फी प्रक्रिया में एक पैरामिट्रीकृत प्रकार के लिए सूचक का उपयोग कर सकते कैसे ? मैं पूरी कक्षा को एक टेम्पलेट वर्ग नहीं बनाना चाहता हूं।

type 
    TMyGeneric<T> = class 
    type 
    P = ^T; 
    public 
    procedure DoStuff(tPtr: P); 
    end; 

और अगर आप एक वर्ग विधि (यानी नहीं एक उदाहरण विधि) चाहते हैं तो आप इसे इस तरह से कर सकते हैं:

उत्तर

11

यह आप सामान्य वर्ग में एक नेस्टेड प्रकार के रूप में एक सूचक प्रकार की घोषणा करने की जरूरत है ऐसा करने के लिए :

type 
    TMyGeneric<T> = record 
    type 
    P = ^T; 
    public 
    class procedure DoStuff(tPtr: P); static; 
    end; 

var 
    int: Integer; 
... 
TMyGeneric<Integer>.DoStuff(@int); 

या एक वर पैरामीटर का उपयोग:

type 
    TMyGeneric<T> = record 
    public 
    class procedure DoStuff(var a: T); static; 
    end; 

यह recor उपयोग करने के लिए आम हो रहा है सामान्य प्रकार के वर्गों के बजाय डीएस जो तत्काल नहीं मिलता है।

अंत में, आपके पास क्लास जेनेरिक बनाने के बिना एक सामान्य विधि डेल्फी में नहीं हो सकता है।

:

Thorsten के जवाब से पता चलता वर्ग सामान्य बनाने के बिना एक सामान्य विधि को लागू करने के लिए कैसे, कि ++ टेम्पलेट कोड निम्नलिखित सी की की डेल्फी एनालॉग है: दूसरे शब्दों में निम्नलिखित सी ++ टेम्पलेट कोड का कोई अनुरूप है

class C { 
public: 
    template <typename T> 
    int SomeTemplateFunction(T* data) { 
     printf("Address of parameter is %p\n", data); 
     return 0; 
    } 
}; 

int a; 
char c; 
C cinst; 
cinst.SomeTemplateFunction<int>(&a); 
cinst.SomeTemplateFunction<char>(&c); 

थॉर्स्टन का उत्तर आपको कक्षा का कार्य देता है लेकिन टिप्पणियों में आप कहते हैं कि आप एक सामान्य सदस्य फ़ंक्शन की तलाश में हैं।

type 
    TMyClass = class 
    public 
    procedure DoStuff<T>(var a: T); 
    end; 

procedure TMyClass.DoStuff<T>(var a: T); 
begin 
end; 

... 
var 
    instance: TMyClass; 
    i: Integer; 
    s: string; 
... 
    instance.DoStuff<Integer>(i); 
    instance.DoStuff<string>(s); 

हालांकि, क्या मैं के साथ संघर्ष कर रहा हूँ कैसे वास्तव में तुम बहुत डेल्फी में, इस के साथ उपयोगी कुछ भी, कि बस के रूप में प्रभावी रूप से एक सामान्य समाधान के बिना नहीं किया जा सकता है कर सकता है।

मैं किसी भी सुझाव की सराहना करता हूं और उन्हें समायोजित करने के उत्तर को संपादित करने में प्रसन्नता होगी।

+0

@ डेविड: क्या आप वाकई यही एकमात्र तरीका है? एकमात्र कारण मैंने फ़ंक्शन को एक क्लास फ़ंक्शन बनाया है, इसलिए मैं जेनिक्स का उपयोग कर सकता हूं, और मैं कक्षा के उपयोगकर्ता को प्रत्येक अलग-अलग प्रकार के लिए कक्षा का एक नया उदाहरण बनाना नहीं चाहता हूं, जिसके साथ वह फ़ंक्शन का उपयोग करना चाहता है। वास्तव में, एक आवश्यकता यह है कि उपयोगकर्ता एक ही फ़ंक्शन का उपयोग कक्षा के उसी उदाहरण पर विभिन्न प्रकार के मानकों के साथ कर सकता है। यदि यह वास्तव में एकमात्र तरीका है, तो यह डेल्फी की दिमागी सीमा है। – Hal

+0

@ डेविड मेरे पास इस समस्या का एक और उदाहरण है जहां यह कक्षा विधि नहीं हो सकता है। उपर्युक्त टिप्पणी में कृपया मेरे प्रश्न का उत्तर दें। – Hal

+0

@ हॉल मैंने इसका उत्तर दिया है। अपडेट किए गए उत्तर के दूसरे कोड खंड में आपके पास जेनेरिक प्रकार का उदाहरण कभी नहीं होगा। आप इसे 'MyGeneric कहते हैं। डॉस्टस्ट (@int);' यह थोड़ा सा शब्द है, लेकिन यह वही है जो आप इसे करते हैं। –

4

आप विधि के लिए कक्षा से सामान्य पैरामीटर स्थानांतरित कर सकते हैं, और एक सूचक प्रकार के बजाय वर का उपयोग करें:

type 
    TMyGeneric = record 
    class procedure DoStuff<T>(var aParam: T); static; 
    end; 

var 
    int : Integer; 
    s : string; 
... 
TMyGeneric.DoStuff<Integer>(int); 
TMyGeneric.DoStuff<string>(s); 

संपादित करें: दुर्भाग्य से डेल्फी संकलक प्रकार निष्कर्ष प्रदर्शन करने के लिए सक्षम होने के लिए प्रतीत नहीं होता जब var पैरामीटर का उपयोग किया जाता है जो विधि कॉल पर < ..> का उपयोग करके जेनेरिक पैरामीटर प्रकार को स्पष्ट रूप से निर्दिष्ट करना आवश्यक बनाता है।

"var" < के बिना "> छोड़ा जा सकता है (लेकिन तब विधि अब पारित चर को संशोधित नहीं कर सकती है)।

+0

+1 कूल। मुझे नहीं पता था कि आप यह कर सकते हैं (जाहिर है!) हालांकि, यह मेरे लिए संकलक नहीं है। मुझे लगता है कि आपको चाहिए: 'TMyGeneric.DoStuff (int)'। –

+0

आप सही हैं, "var" के साथ आपको का उपयोग करने की आवश्यकता है। मेरे पास पहले पैरामीटर के लिए प्रकार अनुमान का उपयोग करने का कोई कारण नहीं था और यह मानने की गलती की गई कि यह गैर-var पैरामीटर के साथ ही साथ ही काम करता है। स्पष्ट रूप से डेल्फी कंपाइलर जेनिक्स के साथ अभी भी सीमित है, मैंने सोचा था। यदि आप "var" छोड़ देते हैं तो टाइप अनुमान काम करता है, लेकिन मुझे लगता है कि प्रश्नकर्ता ने पॉइंटर्स के बारे में पूछा क्योंकि वह पारित चर को संशोधित करने का इरादा रखता है, इसलिए var को छोड़ना एक विकल्प नहीं है। –

+0

मुझे लगता है कि आपको अपना उदाहरण संपादित करना चाहिए ताकि यह संकलित हो और अंतिम पैराग्राफ को सही कर सके। –

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

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