2012-05-08 10 views
6

मैं इस तरह उदाहरण कोड को देखा है पहलेनिर्दिष्ट समारोह पैरामीटर प्रकार है, लेकिन चर नहीं

class C 
{ 
    C(); 
    ~C(); 
    foo(T1, T2); 
} 

C::foo(T1, T2) 
{ 
    //not using T1/T2 
} 
इस

class D 
{ 
    D(); 
    ~D(); 
    bar(T1 t1, T2 t2); 
} 

D::bar(T1 t1, T2 t2) 
{ 
    //using t1 and t2 
} 

तरह

पारंपरिक कोड बनाम और मैं सोच रहा हूँ क्या परिभाषित करने नहीं का उद्देश्य है अपने उपयोगिता के लिए चर टाइप करें? क्या अधिकांश लोग यह संकेत देते हैं कि एपीआई के उन पैरामीटर वर्तमान में उपयोग में नहीं हैं, बल्कि भविष्य में पिछड़े संगतता सुनिश्चित करने के लिए?

क्या यह संभवतः आरटीटीआई के लिए है, या स्थैतिक चर के संदर्भ में है (हालांकि मैंने देखा है कि विभिन्न नमूने इस उद्देश्य के लिए इसका उपयोग नहीं कर रहे थे, वे भी टेम्पलेट किए गए कार्यों को कम करते थे, चर आसानी से अप्रयुक्त थे)। मैंने इस सुविधा की खोज करने की कोशिश की है, लेकिन मुझे यह भी यकीन नहीं है कि इसे क्या कहा जाता है या क्या खोजा जाए।

असल में, इस दृष्टिकोण का उपयोग करने के कारण क्या हैं/लाभ/डाउनसाइड्स?

+2

संबंधित प्रश्न: http://stackoverflow.com/questions/771492/c-style-convention-parameter-names-within-class-declaration – Gorpik

+1

शायद कंपाइलर को अप्रयुक्त पैरामीटर की चेतावनी नहीं देने के तरीके के रूप में ... नहीं अच्छा विचार, आईएमएचओ, यद्यपि। – dbrank0

उत्तर

9

यह आमतौर पर अप्रयुक्त चर के बारे में संकलक चेतावनियों को दबाने के लिए किया जाता है। जब आप एक चर नाम नहीं बनाते हैं, तो संकलक आपको चेतावनी नहीं देगा कि चर में फ़ंक्शन का उपयोग नहीं किया जा रहा है।

आप जैसा कहा गया है, इसके मापदंडों विशेष कार्यान्वयन के लिए इस्तेमाल नहीं किया जा रहा है आमतौर पर कि:

class an_iface 
{ 
public: 
    an_iface(); 

    virtual int doSomething(int valNeeded)=0; 
} 

#define NOT_SUPPORTED -1 
class something : public an_iface 
{ 
public: 
    something(); 
    int doSomething (int) { return NOT_SUPPORTED; } 
} 

class somethingMore : public an_iface 
{ 
public: 
    somethingMore(); 
    int doSomething(int stuff) { return stuff * 10; } 
} 
+0

तो मूल रूप से, इस अर्थपूर्ण का उपयोग करने का बिल्कुल कोई कारण नहीं है यदि आप इसे कुछ पॉलिमॉर्फिक फैशन में उपयोग नहीं कर रहे हैं? यदि कोई अन्य कारण या बेहतर उपयोग मामलों के मामले में मैं इसे स्वीकार करूंगा। –

+0

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

+0

तब स्वीकार्य उत्तर, dbrank0 ने कंपाइलर चेतावनियों को दबाने के एक ही विचार पर भी स्पर्श किया ... हालांकि मैं मानता हूं कि यह शायद एक अच्छा विचार नहीं है। यह भी आपका इरादा पूरी तरह से स्पष्ट नहीं करता है। –

3

पैरामीटर्स अधिक मामलों में लागू करता है जो वास्तुकला और सीधे

पैरामीटर मई से प्रभावित पहले तैयार कर रहे हैं अप्रयुक्त हो क्योंकि:

  1. अधिभार एक आभासी समारोह जो अधिक पैरामीटर व्युत्पन्न वर्ग में जरूरत से है
  2. पैरामीटर इतिहास कारण के लिए मौजूद हैं, और एपीआई बदलने के लिए अभी तक
  3. भविष्य @dag क्या उल्लेख किया है से
+0

बहुत अच्छा दूसरा बिंदु। बड़ी परियोजनाओं में आप जब भी ऐसा महसूस करते हैं तो एपीआई नहीं जा सकते और तोड़ नहीं सकते हैं, इसलिए रिलीज होने तक अप्रचलित पैरामीटर को टिप्पणी करना सबसे अच्छा है। – Thomas

5

अलावा की जरूरत के लिए विचार करें नहीं करना चाहते, पैरामीटर नाम के बिना एक समारोह परिभाषा इसकी पाता है टेम्पलेट विशेषज्ञता में उपयोग। मैं जानता हूँ कि आपने उल्लेख किया है उदाहरण में से कोई भी टेम्पलेट आप पोस्ट किया है देखते हैं कि, लेकिन पूर्णता के लिए के लिए मैं इस उपयोग के मामले पोस्ट करने के लिए करना चाहते हैं:

मान लीजिए आप std कंटेनरों के लिए एक erase समारोह को परिभाषित किया है। लेकिन आप कंटेनर प्रकार के आधार पर वास्तविक कार्य करने के लिए अलग erase_helper चाहते हैं। traits का उपयोग करना एक आम और स्वीकार्य अभ्यास है।

// Tags for containers 
struct vector_tag {}; 
struct map_tag {}; 

// Trait class 
template <typename C> struct container_traits; 

// Specialization of trait class 
template <typename T, typename A> 
    struct container_traits<std::vector<T, A>> 
    { 
    typedef vector_tag category; 
    }; 

template <typename K, typename V, typename C, typename A> 
    struct container_traits<std::map<K, V, C, A>> 
    { 
    typedef map_tag category; 
    }; 

// Helper function 
template <typename Container, typename X> 
    void erase_helper(Container& c, const X& x, vector_tag) // <-- no param name 
    { 
    // Erase element from vector 
    } 

template <typename Container, typename X> 
    void erase_helper(Container& c, const X& x, map_tag) // <-- no param name 
    { 
    // Erase element from map 
    } 

// Function interface 
template <typename Container, typename X> 
    void erase(Container& c, const X& x) 
    { 
    erase_helper(c, x, typename container_traits<Container>::category()); 
    } 

आप यहाँ देख सकते हैं, erase_helper एक नाम के बिना तृतीय पैरामीटर है। पैरामीटर का प्रकार टेम्पलेट तत्काल चरण में सही फ़ंक्शन चुनने के लिए कंपाइलर को बताता है।

+2

निष्पक्ष होने के लिए, यह अभी भी बहुलक उपयोग है। आप बस रन टाइम के बजाए संकलन समय पर अपना बहुरूपता कर रहे हैं। – Managu

+1

@Managu, हाँ यह है। लेकिन मूल प्रश्न पॉलिमॉर्फिक उपयोग को छोड़कर सभी उपयोग मामलों के लिए नहीं पूछ रहा था :-)। – Vikas

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