2012-03-06 14 views
14

में टाइपएफ़ टाइपपीफ टाइप प्रकार सुरक्षा बढ़ाने के लिए मैं अपने सी ++ प्रोग्राम में टाइपपीफ जैसे कुछ का उपयोग करना चाहता हूं।सी ++

एक उदाहरण के रूप में, मैं दो कार्यों

void function1(unsigned idOfType1); 
void function2(unsigned idOfType2); 

है तो मैं गलती से पारित कर सकते हैं idOfType2 function1 और इसके विपरीत करने के लिए लगता है। मैं संकलक चाहता हूं कि मुझे इस मामले में एक त्रुटि दें। मुझे पता है कि मैं इन्हें एक स्ट्रक्चर में हस्ताक्षरित कर सकता हूं, लेकिन फिर मुझे फ़ील्ड नाम देना होगा और उन्हें एक्सेस करने के लिए . का उपयोग करना होगा, जो थोड़ा असुविधाजनक है। क्या इसके चारों ओर एक अच्छा तरीका है?

संपादित करें: जहां तक ​​मुझे पता है कि typedef इस उद्देश्य के लिए काम नहीं करेगा क्योंकि यह एक प्रकार के लिए सिर्फ एक शॉर्टेंड है और टाइपिंग जांच के लिए उपयोग नहीं किया जाएगा।

+2

Enums अच्छी तरह से काम आपके मामले में ... –

+0

@AlexanderPavlov विस्तृत करने के लिए देखभाल, यह मेरे लिए स्पष्ट नहीं है ... – Paul

+2

@ पॉल: आप कुछ लिख सकते हैं जैसे 'enum Type1 {dummy0 = 1, dummy1 = 1 << 1, dummy2 = 1 < <2, ..., dummy31 = 1 << 31}; ', और आपके हस्ताक्षर पर' हस्ताक्षरित '32 बिट प्रकार है, तो परिणाम एक enum है जो 'unsigned' के किसी भी मान को पकड़ सकता है। फिर 'शून्य कार्य 1 (टाइप 1 आईडी) '' टाइप 2' स्वीकार नहीं करेगा, क्योंकि enums एक दूसरे के लिए पूरी तरह से परिवर्तनीय नहीं हैं। –

उत्तर

6

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

उदाहरण के लिए:

struct WrappedType 
{ 
    operator type() 
    { 
     return _value; 
    } 

    type _value; 
} 

मैं यह नहीं कह रहा हूँ इस है जिस तरह से यह मन आप ;-)

+1

क्या आप मुझे दिखा सकते हैं कि मैं टाइप ऑपरेटर का उपयोग कैसे कर सकता हूं? मजबूत टाइपपीफ को बढ़ावा देना सामान्य रूप से एक अच्छा विकल्प जैसा दिखता है, लेकिन शायद मेरे मामले में काम नहीं कर सकता है, इसलिए मुझे इस समाधान में दिलचस्पी है! – Paul

+0

जहां तक ​​मैं समझता हूं, यह वही है जो बूस्ट के मजबूत टाइपपीफ करता है ... – Griwes

+1

@ कोनराड महान! विस्तृत करने के लिए धन्यवाद। अगर मैं मजबूत मजबूत टाइपपीफ का उपयोग नहीं कर सकता तो मैं इस समाधान का उपयोग करूंगा। – Paul

15

उपयोग Boost strong typedef:

typedef एक मौजूदा प्रकार के लिए एक उपनाम पैदा करता है। यह एक नए प्रकार है कि या तो समारोह या टेम्प्लेट पैरामीटर मिलान के लिए इस्तेमाल किया जा सकता ...

BOOST_STRONG_TYPEDEF का उपयोग इस के पते का निर्माण नहीं करता ...

BOOST_STRONG_TYPEDEF एक मैक्रो जो एक वर्ग नाम "नाम" के लेप उत्पन्न करता है और इसके आदिम प्रकार का उदाहरण और उचित रूपांतरण ऑपरेटर प्रदान करता है ताकि नए प्रकार को प्रतिस्थापित करने के लिए प्रतिस्थापित किया जा सके।

+1

मुझे होना चाहिए पूछने से पहले चेक की जांच करें ... तेज़ उत्तर के लिए धन्यवाद! – Paul

+0

ध्यान दें कि मजबूत टाइपपीफ को बढ़ावा दें असाइनमेंट में निहित रूपांतरण की अनुमति दें। – larsch

0

वहाँ एक C++ 11 सुविधा enum class कहा जाता है, जो है क्या करने के लिए मूल रूप से एक प्रकार सुरक्षित enum। शायद वे यहां मदद कर सकते हैं।

+1

'enum' हमेशा टाइपएफ़ होते हैं, उदा। 'enum x {a}; enum वाई {बी}; y = a; 'संकलित नहीं होगा.- –

+1

@phresnel मुझे लगता है कि यह केवल आधा सच है क्योंकि enums को अंतर्निहित रूप से इनट्स में परिवर्तित किया जाएगा, नहीं? – Paul

+0

@ पॉल: चलो 0.75 * सच पर सहमत हैं, क्योंकि विपरीत सत्य नहीं है। तो, ऐसा लगता है कि enums 75% टाइपएफ़ हैं, ... –

-2

आप अपने फ़ंक्शन में टाइप देख सकते हैं, ताकि यदि यह मेल नहीं खाता है, तो आप एक त्रुटि या कुछ प्रिंट कर सकते हैं।

आप इस प्रकार, चर का प्रकार निर्धारित करने typeid उपयोग कर सकते हैं:

typeid(*variablename*).name() 

जवाब here में से एक में सुझाव दिया गया है, इस संकलक पर निर्भर है और आप कोशिश और त्रुटि विधि का उपयोग करने खोजने के लिए बाहर कौन सा मूल्य आपके लिए काम करता है।

+1

लेकिन फिर मुझे इसे __every__ फ़ंक्शन कॉल में करना होगा + यह संकलक निर्भर है? क्षमा करें, मुझे नहीं लगता कि यह एक अच्छा विकल्प है ... – Paul

+0

वैसे भी काम नहीं करता है - 'function1' में पैरामीटर' idOfType1' का प्रकार हमेशा 'हस्ताक्षरित' होता है। कॉलर द्वारा पारित किया गया क्या पहले से ही परिवर्तित कर दिया गया है। –

2

मैं इसे भाषा में चाहता हूं। नहीं एक उत्तर दर असल, लेकिन ... :)

Opaque typedefs

1

यह एक पुरानी प्रश्न के देर से जवाब है।लेकिन वहाँ सी ++ के मोर्चे पर और संपूर्णता मैं इस सवाल का जवाब जोड़ रहा की खातिर नए घटनाक्रम इस प्रकार हैं:

opaque_typedef पुस्तकालय एक पुस्तकालय के माध्यम से अपारदर्शी typedefs के मूल्य का सबसे प्रदान करने के लिए लेखक का प्रयास है, एक भाषा सुविधा बनने के लिए अपारदर्शी typedefs के इंतजार किए बिना।

इस पुस्तकालय के लेखक, केली मार्ले के पास इस पुस्तकालय को पेश करने के लिए short brilliant speech at the cppcon 2015 था। उनके भाषण की स्लाइड github पर हैं लाइब्रेरी का स्रोत कोड sourceforge पर उपलब्ध है। पुस्तकालय हेडर-केवल है, सी ++ 11 में लिखा गया है। जीसीसी और क्लैंग ठीक है, लेकिन वीएस2015 में इसके साथ समस्याएं हैं।

लाइब्रेरी का उपयोग सीधे-आगे है। निम्नलिखित कोड दस्तावेज से लिया गया था। यह int की एक अपारदर्शी टाइपपीफ बनाता है। यह एक पूर्णांक के रूप में ही इंटरफ़ेस है (यह जोड़ा जा सकता है स्थानांतरित कर दिया, वृद्धि, तुलना, आदि), लेकिन तर्क और मान int की नहीं, नव निर्मित प्रकार के होते हैं:

#include "opaque/numeric_typedef.hpp" 

struct myint : opaque::numeric_typedef<int, myint> { 
    using base = opaque::numeric_typedef<int, myint>; 
    using base::base; 
}; 

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

  • कोई संबंधित समस्या नहीं^_^