2009-07-26 13 views
7

कुछ सी ++ कोड में, मैं बहुत सारे बदलते डेटा को स्टोर करने के लिए पूर्णांक का उपयोग करता हूं। मेरे प्रोग्राम का विश्लेषण करने के लिए, मैं कुछ चरों में कुछ परिवर्तन लॉग करना चाहता हूं, जैसे कि कितनी बार एक निश्चित मान असाइन किया जाता है, और कितनी बार वह असाइनमेंट अनावश्यक होता है (नया मान पुराने मान के समान होता है।)सी ++ मूल प्रकार से प्राप्त होता है

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

मेरी समस्या यह है कि वे चर जो मैं लॉगिंग जोड़ना चाहता हूं वह एक int है। आप C++ में निर्मित प्रकारों से प्राप्त नहीं कर सकते हैं (क्या आप?)

मेरा प्रश्न यह है कि मूल प्रकार (int, float, double, आदि) से प्राप्त करने का एक चालाक तरीका है या नहीं।

समाधान है कि प्रभावी रूप से एक पूर्णांक है एक नया वर्ग को परिभाषित करने में हो सकता है .. यह को परिभाषित करता है हर आपरेशन किसी पूर्णांक कर सकते हैं और बस के लिए एक निजी पूर्णांक डेटा सदस्य है कि आपरेशन लागू होता है। यह रणनीति काम करेगी, लेकिन शायद अन्य पहले से ही इस तरह की कक्षा बना चुके हैं और मैं सिर्फ "fakeint.h" हेडर फ़ाइल परिभाषा का उपयोग कर सकता हूं। क्या ऐसा कोई "प्रॉक्सी देशी वर्ग रैपर" टाइप परिभाषाएं पहले से ही उपलब्ध हैं, इससे पहले कि मैं उन्हें स्वयं लागू कर सकूं?

मुझे एहसास है कि मेरे प्रॉक्सी इंट को इंट के साथ एक दूसरे के साथ अंतःक्रियात्मक रूप से उपयोग नहीं किया जा सकता है, खासकर जब मौजूदा फ़ंक्शन परिभाषाएं सभी int की अपेक्षा करती हैं .. लेकिन मेरे ऐप के लिए, यह सब एक आंतरिक लूप में है जो बहुत सरल कर रहा है मूल + - *^= संचालन, फ़ंक्शन तर्क या कुछ भी के रूप में उपयोग नहीं किया जाता है।

+1

आपको बूस्ट के ऑपरेटरों में देखना चाहिए: http://www.boost.org/doc/libs/1_39_0/libs/utility/operators.htm। यह आपको एक कक्षा बनाने देगा जिससे सभी सामान्य ऑपरेटर इसे मूल पूर्णांक प्रकार की तरह कार्य कर सकें। –

+0

@Evan .. धन्यवाद, यह सामान्य रूप से एक अच्छा संसाधन है! मुझे जो चाहिए वह ओवरकिल लेकिन अगर मुझे अपना खुद का रोल करने की ज़रूरत है तो यह अनावश्यक काम को काफी हद तक कम कर देगा। – SPWorley

उत्तर

6

कुछ इस तरह ...

template <typename T> class logging_type 
{ 
private: 
    T value; 
public: 
    logging_type() { } 
    logging_type (T v) : value(v) { } // allow myClass = T 
    operator T() { return value; } // allow T = myClass 
    // Add any operators you need here. 
}; 

यह एक टेम्पलेट वर्ग पैदा करेगा कि दोनों दिशाओं में मूल प्रकार में परिवर्तनीय है। आपको अपने कोड में उस प्रकार के प्रत्येक ऑपरेशन के लिए लॉगिंग हैंडलिंग और ओवरलोड ऑपरेटर जोड़ना होगा।

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

संपादित: चूंकि C++ 11, आप explicit रूपांतरण ऑपरेटरों के लिए जोड़ सकते हैं।

+2

यह बहुत ही आशाजनक लगता है .. इसमें अपील है कि सबकुछ डिफ़ॉल्ट रूप से काम करता है, और केवल एक ही फंक्शंस जो मुझे लपेटने की ज़रूरत है वे हैं जिन्हें मैं कस्टम लॉगिंग से निपटना चाहता हूं। यह ** लगभग ** काम करता है! मैं = मैं 1 +; ठीक है। cout << मैं; ठीक है। लेकिन उदाहरण के लिए मैं + = 1; या मैं ++; नहीं करता। फिर भी, यह अधिकांश ऑपरेटरों को भरने के लिए अच्छी तरह से काम कर सकता है और मैं मैन्युअल रूप से शेष के साथ सौदा कर सकता हूं। – SPWorley

9

आप से प्रकार डाली ऑपरेटर ओवरलोडिंग से पूर्णांक से एक वर्ग प्राप्त नहीं कर सकते, लेकिन आप Advanced C++: Programming Styles and Idioms से Coplein के कंक्रीट डेटा प्रकार मुहावरा को लागू करने से int के साथ एक कक्षा (जैसे Integer) कि विनिमेय है बनाने के लिए सक्षम होना चाहिए और उसके बाद Integer से int और एक रूपांतरण ऑपरेटर को int से Integer से परिभाषित करना।

यहाँ एक और लिंक है कि बुनियादी Idioms पुस्तक

और अभी तक एक और लिंक मुझे लगता है कि सुंदर क्या आप के लिए http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Int-To-Type

-1

देख रहे हैं आप आदिम प्रकार

से कभी नहीं निकाले जाते हैं कर सकते हैं के करीब है से वर्णन करता है
+2

सच है, लेकिन अन्य चीजें हैं जो किया जा सकता है, शायद यही कारण है कि आपको नीचे वोट क्यों मिला (किसी और से)। –

3

यह वास्तव में एक मामला है जहां #define बहुत उपयोगी है। मेरा सुझाव है

#ifdef DEBUG 
# define INTGR MyDebugIntegerClass 
#else 
# define INTGR int 
#endif 

सुनिश्चित करें कि MyDebugIntegerClass एक नियमित पूर्णांक के लिए अपने आप में डाल सकता है, और सभी उचित ऑपरेटरों है। फिर, INTGR के साथ अपना कोड लिखें।

डीबग मोड में, आपको अपनी कक्षा के सभी लॉगिंग मिलेंगे, लेकिन रिलीज मोड में, आपको एक सादा-मूल int मिलेगा।

+1

हाँ, मेरे पास पहले से ही टाइपपीफ हैं इसलिए यह और भी आसान है। मेरा मुख्य प्रश्न मैन्युअल रूप से 50+ देशी int ऑपरेटरों को लपेटने के बिना एक MyDebugIntegerClass का निर्माण कर रहा है। (या बस किसी ऐसे व्यक्ति को ढूंढें जो पहले से ही कर चुका है।) – SPWorley

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