2013-01-05 20 views
8

यहां यह जाता है: मैं एक शून्य कार्य बनाना चाहता हूं जो दो प्रसिद्ध प्रकार के मान प्राप्त करेगी और दूसरा ऐसा कुछ भी हो सकता है। कोड इस तरह होगा:सी ++ किसी फ़ंक्शन में किसी भी प्रकार का तर्क भेजें

void change_settings(string element, short setting, ??? value) { 
    switch (setting) { 
     case ST_NAME: 
      // Cast value to string or char* and change element.name 
     break; 
     case ST_AMOUNT: 
      // Cast value to integer and change element.amount 
     break; 
     case ST_ENABLED: 
      // Cast value to boolean and change element.enabled 
     break; 
    } 
} 

मैं मान का प्रकार const void* बनाने के लिए tryied लेकिन मुझे एक त्रुटि (cast from ‘const void*’ to ‘short int’ loses precision) मिलता है क्योंकि मैं तो बस ऐसा किया: short name = (short)value, जो कुछ पागल हताश परीक्षण होना चाहिए, भाग्यशाली होने की उम्मीद । अब, मुझे नहीं पता कि ऐसा करने का कोई तरीका है या नहीं, किसी भी प्रकार के चर के पॉइंटर को पास करें और फिर इसे परिवर्तित करें (मुझे पता है कि प्रत्येक मामले के आधार पर उम्मीद करने के लिए चर का प्रकार पता है। मैं यह कैसे करूँगा ?!

void change_settings(const std::string& element, short setting, const std::string& value); 

void change_settings(const std::string& element, short setting, int value); 

void change_settings(const std::string& element, short setting, bool value); 

इस को हटा देता है: धन्यवाद

उत्तर

7

जब से तुम value के सभी संभावित प्रकार पहले से पता लगता है, और आप प्रकार के आधार पर अलग व्यवहार चाहते हैं, तो आप सिर्फ समारोह भार के की एक श्रृंखला लिख ​​सकते हैं रन-टाइम स्विच की आवश्यकता।

+0

यही सच है, लेकिन उस समय क्यों प्रत्येक सेटिंग के लिए एक अलग समारोह नहीं बना सकते हैं और स्विच मामले से बचने में उपयोग करना चाहिए। – Caesar

+0

हाँ - यह 'सेटिंग' चर अनावश्यक बनाता है। –

+1

आइए इसे आज़माएं। बेशक, मैं अभी भी स्विच और सेटिंग का उपयोग कर सकता हूं यदि मेरे पास अलग-अलग मामले हैं जहां मुझे एक int मान की आवश्यकता है, उदाहरण के लिए – ali

5

मान लें कि आप रन-टाइम स्विटक के बारे में बात कर रहे हैं हिंग (संकलन समय के विपरीत, जिस स्थिति में टेम्पलेट्स शायद उत्तर हैं):

आप एक संस्करण वर्ग (उदा। boost::variant), या शायद बहुरूपता का उपयोग करें (यानी एक विरासत पदानुक्रम परिभाषित करें, और विशिष्ट व्यवहार को लागू करने के लिए वर्चुअल फ़ंक्शंस)।

+0

पर सरल उदाहरण मुझे लगता है कि यह करने का यह पेशेवर तरीका है, लेकिन जब मैं कुछ गंभीर एप्लिकेशन बनाउंगा तो मैं इसे ध्यान में रखूंगा। धन्यवाद – ali

+0

आपका मतलब है कि दूसरा विकल्प के रूप में 'boost :: any''? – Puppy

12

आप templates

template <typename T> 
void change_settings(string element, short setting, T value); 
+0

बढ़िया! धन्यवाद! यह – ali

+2

समस्या होगी कि समस्या यह है कि 'टी' गलत प्रकार होने पर उसके रन-टाइम स्विच कोड में कास्ट संकलित नहीं होगा। मैं सिर्फ फ़ंक्शन ओवरलोड की श्रृंखला लिखूंगा –

+0

दरअसल, ऐसा ही होता है। – ali

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