2012-03-09 28 views
9

बस यह सुनिश्चित करने के लिए कि मैंने जो पढ़ा है और कोशिश की है, मैं फ़ंक्शन टेम्पलेट में डिफ़ॉल्ट तर्क नहीं डाल सकता? मैंने अपने कंपाइलर से और दोनों के साथ प्रतिक्रिया व्यक्त की है ... मैं पूछ रहा हूं क्योंकि मैं एक नया हूं और कुछ तकनीकी प्रतिक्रियाओं को समझना मुश्किल है। क्या इसके आसपास कोई कार्य है? मैं एक डिफ़ॉल्ट संबंधपरक ऑपरेटर का उपयोग करता है एक findmax समारोह बनाने के लिए विकल्प के साथ ओवरलोड करने की कोशिश कर रहा हूँ, लेकिन ... यानी:फ़ंक्शन टेम्पलेट में डिफ़ॉल्ट तर्क C++

template <typename Type, typename Compare = std::less<Type> > 
Type FindMax(std:vector<Type> &vec, Compare comp = Compare()) { 
    return *std::max_element(... 
} 

मुझे लगता है मैं इस के लिए एक वर्ग बना सकता है लगता है, लेकिन यह बहुत काम की तरह लगता है जब मैं वास्तव में एक समारोह चाहता हूं ... धन्यवाद!

क्या इस समारोह tempate क्या करता है, विशेष रूप से, क्या (cmpFn) ...) डिफ़ॉल्ट तर्क कर रही है:

मैं कुछ के बारे में और साथ ही एक और सवाल जोड़ना चाहिए मैं पहले देखा है कि?

template <typename ElemType> 
    ElemType FindMax(Vector<ElemType> &v, int (cmpFn)(ElemType, ElemType) = OperatorCmp) 
+0

* [सी ++ टेम्पलेट समारोह डिफ़ॉल्ट मान] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3301362/c-template-function-default-value) *। –

उत्तर

8

चीजों के एक नंबर कहने के लिए कर रहे हैं:

  1. आप क्या परिभाषित एक समारोह टेम्पलेट, नहीं एक वर्ग टेम्पलेट है। यदि आप एक डिफ़ॉल्ट टेम्पलेट पैरामीटर

    typename Compare = std::less<Type>

    उपयोग कर रहे हैं के बाद से मुझे लगता है आप पहले से ही सी ++ 11 उपयोग कर रहे हैं, क्योंकि सभी के लिए मुझे पता है समारोह टेम्पलेट्स मानक के पिछले संस्करणों में डिफ़ॉल्ट टेम्पलेट पैरामीटर की अनुमति नहीं थी ।

  2. दूसरी ओर, डिफ़ॉल्ट तर्क यह

    Compare comp = Compare()

    तरह टेम्पलेट मापदंडों के भी मानक के पिछले संस्करण में संभव थी। आपका बयान कि टेम्पलेट पैरामीटर के लिए डिफ़ॉल्ट तर्क संभव नहीं हैं (या शायद यह वास्तव में जिसे मैंने डिफ़ॉल्ट टेम्पलेट पैरामीटर कहा जाता है) को संदर्भित किया है।

  3. कंपाइलर त्रुटि संदेश जो आपको प्राप्त होता है वह किसी अन्य समस्या के कारण होना चाहिए। शायद Type का उपयोग करके आप std::less के साथ अच्छी तरह से नहीं जाते हैं, या Compare प्रकार का उपयोग आप डिफ़ॉल्ट कन्स्ट्रक्टर को लागू नहीं करते हैं। किसी भी मामले में, निम्नलिखित प्रोग्राम जीसीसी 4.6 पर संकलित करता है।2 (ध्यान दें कि मैं const std::vector<> & करने के लिए std::vector<> & बदल क्योंकि है कि और अधिक सही लग रहा था):

 

#include <vector> 
#include <functional> 
#include <algorithm> 

template <typename Type, typename Compare = std::less<Type> > 
Type FindMax(const std::vector<Type> &vec, Compare comp = Compare()) { 
    return *std::max_element(vec.begin(),vec.end(),comp); 
} 

int main() { 
    FindMax(std::vector<int>()); 
    return 0; 
} 

और वास्तव में इस -std=C++0x विकल्प आवश्यकता है, लेकिन वह यह है कि क्योंकि डिफ़ॉल्ट टेम्पलेट पैरामीटर, नहीं डिफ़ॉल्ट तर्क।

cmpFn से संबंधित अतिरिक्त प्रश्न के बारे में:

एक समारोह पैरामीटर घोषणा करता है कि, यानि कि एक तर्क एक समारोह है जो अपने आप को। घोषणा

int (cmpFn)(ElemType, ElemType) 

का मतलब समारोह का स्थानीय नाम cmpFn है, इसकी वापसी प्रकार int है, और यह दोनों प्रकार ElemType के दो तर्क लेता है,। विचार यह है कि कॉलर एक फ़ंक्शन (या एक मजेदार) पास कर सकता है जिसका उपयोग वेक्टर के तत्वों की तुलना करने के लिए किया जाएगा। जैसे यदि आप पहले इस तरह समारोह घोषणा कि तर्क OperatorCmp का डिफ़ॉल्ट मान निर्धारित करें:

int OperatorCmp(int a, int b) { 
    return (a<b?-1:(a>b?1:0)); 
} 

घोषणा मान्य हो जाता है और आप इसे उपयोग कर सकते हैं एक std::vector<int> का अधिकतम मान खोजने के लिए।

+0

धन्यवाद। वह दूसरा भाग वह है जो मैं खोज रहा था केवल मुझे यह नहीं पता था ... एक समारोह पैरामीटर। – MCP

+1

नोट: 'cmpFn' का उपयोग' std :: max_element' के साथ नहीं किया जा सकता है क्योंकि यह एक बूलियन परिणाम ('<' के समान) की अपेक्षा करता है, न कि टर्नरी परिणाम। –

5

आप इसे C++ 11 में कर सकते हैं। सी ++ 03 के रूप में आप अलग-अलग तर्कों के साथ दो अधिभार बनाकर और एक से दूसरे में अग्रेषण करके आसानी से इसके आसपास काम कर सकते हैं।

template <typename Type> 
Type findMax(std::vector<Type> const & v) { 
    return findMax(v, std::less<Type>()); 
} 

वैकल्पिक रूप से आप मानक एल्गोरिदम का उपयोग कर सकते हैं और अपना खुद का लिखने से बच सकते हैं।

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