2012-03-31 14 views
8

स्टोरेज क्लास तक पहुंच बनाने की कोशिश करने के बाद थोड़ा आसान, मैं एक ऐसी स्थिति में समाप्त हुआ जिस पर मुझे बहुत ज्ञान नहीं है। और, उन लोगों को ढूंढना जो मेरे जैसा ही करने की कोशिश कर रहे हैं, आसान नहीं है।सी ++ ऐरे सब्सक्रिप्शन ऑपरेटर टेम्पलेट

जो मैं करने की कोशिश कर रहा हूं, उसमें एक कक्षा है जो आंतरिक रूप से स्ट्रिंग के रूप में मानों की एक सरणी संग्रहीत करती है, लेकिन उपयोगकर्ता के अंत से सरल प्रकार का कास्टिंग करने की अनुमति देती है। जो मैंने करने की योजना बनाई थी वह सरणी सबस्क्रिप्ट ऑपरेटर का उपयोग किसी भी प्रकार के टेम्पलेट के माध्यम से निर्दिष्ट करने के लिए करने के लिए करती है। हालांकि, यह अभ्यास में काम करने से काफी बेहतर लगता है। कार्य के बारे में आपको यह बताने के लिए कि मैं क्या कर रहा हूं, इसका एक सरल उदाहरण यहां दिया गया है।

class StringList 
{ 
    public: 
    template <typename T> 
    T operator[](const int i) 
} 

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

StringList list; 
T var = list<T>[0]; 

क्या कोई भी सबस्क्रिप्ट ऑपरेटर को टेम्पलेट के रूप में कॉल करने का उचित तरीका जानता है? या, क्या मुझे बस ऐसा करने से बचना चाहिए, और नामित विधि का उपयोग करना चाहिए?

+0

मैं इस उद्देश्य के लिए ओवरलोडिंग 'ऑपरेटर []' के खिलाफ सावधानी बरतता हूं क्योंकि अधिभारित ऑपरेटरों का सबसे अच्छा उपयोग तब किया जाता है जब वे वाक्य रचनात्मक रूप से सार्थक होते हैं। आप सामान्य रूप से 'सूची [0]' जैसी चीज़ नहीं लिखते हैं, और मुझे लगता है कि अतिरिक्त बौद्धिक उपरि इसके लायक नहीं है। क्यों न केवल 'get' विधि टेम्पलेट बनाएं और' list.get (0) 'पर कॉल करें? – templatetypedef

+0

@templatetypedef मैं पूरी तरह से सहमत हूं। मैं शायद नामित फ़ंक्शन के साथ चिपकने की संभावना से अधिक था, क्योंकि मुझे यह भी समझ में नहीं आता कि आप इस तरह के टेम्पलेट को कैसे लिखेंगे। लेकिन, मुझे यह जानने के लिए उत्सुकता है कि यह कैसे लिखा जाएगा, इस पर ध्यान दिए बिना कि मुझे कभी इसका उपयोग करने की आवश्यकता है या नहीं। – TheCodeBroski

उत्तर

10

आपके ऑपरेटर को कॉल करने का एकमात्र तरीका स्पष्ट रूप से list.operator[]<T>() लिख रहा है।

वहाँ बाहर दो बुनियादी तरीके हैं: (के रूप में templatetypedef द्वारा प्रस्तावित)

  1. लिखें list.get<int>() की तरह एक समारोह टेम्पलेट
  2. वापसी T के लिए स्वत: बातचीत के साथ एक प्रॉक्सी।

कोड देखने की तरह होगा:

// in the class 
struct proxy { 
    proxy(StringList *list, int i) : list(list), i(i) {} 
    StringList *list; 
    int i; 
    template <typename T> 
    operator T() { return list->get<T>(i); } 
}; 

proxy operator[](int i) { return proxy(this, i); } 

template <typename T> 
T get(int i) { return ...; T(); } 

// how to use it: 
StringList list; 
int var = list.get<int>(0); 
float var2 = list[0]; 
+1

मुझे यह स्वीकार करना होगा कि मैं आपके प्रॉक्सी-आधारित समाधान को समझ नहीं पा रहा हूं। क्या आप थोड़ा सा विस्तार करना चाहते हैं? 'टी प्राप्त करने का उद्देश्य क्या है (int i) {वापसी ...; टी(); } '? 'प्रॉक्सी ऑपरेटर [] (int i) कैसे है {वापसी प्रॉक्सी (यह, i); } 'स्ट्रिंगलिस्ट 'से संबंधित है? लाइन 'फ्लोट var2 = सूची [0];' काम कैसे करता है? हालांकि उन्नत सी ++ तकनीकों का मेरा थोड़ा सा ज्ञान यहां कारण हो सकता है। :-) –

4

मुझे लगता है कि [] ऑपरेटर के प्राकृतिक कॉल करने के लिए टेम्पलेट पैरामीटर पास करने के लिए कोई वाक्य रचना होती है। आप शायद कॉल करने के लिए की आवश्यकता होगी:

T var = list.operator[]<T>(0); 

की तरह आप सामान्य टेम्पलेट कार्यों के साथ करते हैं, इसलिए यहाँ ऑपरेटर अधिभार का प्रयोग करने में कोई मतलब नहीं है।

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