2010-09-18 16 views
5

मेरे पास दो सी ++ प्रोग्राम हैं जिनके पास नक्शा type -> int है जो संकलन समय और दो प्रोग्रामों के बीच बराबर है। इसके अलावा, मैं स्वचालित रूप से यह सुनिश्चित करना चाहता हूं कि मानचित्र संकलित समय पर नक्शा एक-एक हो। आप इसे कैसे हल करेंगे? (सी ++ 0x-एक्सटेंशन की अनुमति है)। पहला भाग आसान है:टाइप करने के लिए int मैपिंग

template < typename T > struct map; 
template <> struct map <...> { enum { val = ...; }; }; 

प्रोग्राम के बीच साझा करें। (दूसरे भाग का अर्थ है कि मैं अपने कार्यक्रमों में कहीं भी दो अलग-अलग प्रकारों के लिए val को गलती से परिभाषित नहीं करना चाहता हूं।)

+0

क्या मैं पूछ सकता हूं कि यह मैपिंग क्या है? – sellibitze

+0

[टेम्पलेट मेटाप्रोग्राम कनवर्टिंग प्रकार को अद्वितीय संख्या में संभावित डुप्लिकेट] (http://stackoverflow.com/questions/1708458/template-metaprogram-converting-type-to-unique-number) – kennytm

+0

नक्शा मनमानी डेटा को संवाद करने के लिए उपयोग किया जाएगा एक प्रेषक और एक रिसीवर कार्यक्रम के बीच (यही कारण है कि यह सवाल कोई डुप्लिकेट नहीं है - इसमें दो प्रोग्राम शामिल हैं जिन्हें एक ही मानचित्र साझा करने की आवश्यकता है)। – Thomas

उत्तर

9

एक तरह से uniqe आईडी सुनिश्चित करने के लिए दुरुपयोग दोस्त कार्यशील परिभाषाएँ

template<int N> 
struct marker_id { 
    static int const value = N; 
}; 

template<typename T> 
struct marker_type { typedef T type; }; 

template<typename T, int N> 
struct register_id : marker_id<N>, marker_type<T> { 
private: 
    friend marker_type<T> marked_id(marker_id<N>) { 
    return marker_type<T>(); 
    } 
}; 

template<typename T> 
struct map; 

template<> 
struct map<int> : register_id<int, 0> { }; 

// The following results in the following GCC error 
// x.cpp: In instantiation of 'register_id<float, 0>': 
// x.cpp:26:43: instantiated from here 
// x.cpp:14:29: error: new declaration 'marker_type<float> marked_id(marker_id<0>)' 
// x.cpp:14:29: error: ambiguates old declaration 'marker_type<int> marked_id(marker_id<0>)' 
// 
//// template<> 
//// struct map<float> : register_id<float, 0> { }; 
+0

कूल! यह सही समाधान की तरह दिखता है, क्योंकि यह मुझे सूची में सभी प्रकार निर्दिष्ट करने से मुक्त करता है। – Thomas

+1

@ थॉमस अब यह त्रुटि संदेश में विरोधाभासी प्रकार भी दिखाता है। –

2

boost::mpl::map का उपयोग करने के बारे में कैसे? शेयर कुछ की तरह:

// Include your headers 

using namespace boost::mpl; 
typedef map< 
     pair<1,MyFirstClass> 
    , pair<2,MySecondClass> 
    , pair<3,MyThirdClass> 
    > m; 
1

वे इसे सख्ती से नहीं करते संकलन समय पर है, लेकिन कार्य की इस जोड़ी को स्वचालित रूप से होगा प्रत्येक प्रकार उन्हें पारित कर दिया के लिए एक अद्वितीय ID जेनरेट:

template<class T> 
int generate_type_id() { 

    static int value = 0; 
    return value++; 

} 

template<class T> 
int type_id() { 

    static int value = generate_type_id<T>(); 
    return value; 

} 

और आप सुनिश्चित करने के लिए सक्षम होना चाहिए कि दो आवेदन हिस्सेदारी टी वह एक दिया प्रकार के लिए एक ही पहचानकर्ता स्पष्ट रूप से दोनों परियोजनाओं में क्रम में कार्यों लागू द्वारा:

type_id<int>(); 
type_id<Foo>(); 
type_id< map<string, pair<int, Bar> >(); 

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

+0

यह काम नहीं करता है। जब आपके पास 'gener_type_id'' t' द्वारा टेम्पलेट किया गया है तो यह हमेशा 0 (http://ideone.com/Ph3ha) वापस आ जाएगा। लेकिन यदि आप इसे एक गैर-टेम्पलेट फ़ंक्शन बनाते हैं तो इसे काम करना चाहिए (http://ideone.com/zIIGb)। हालांकि यह एक ही आदेश सुनिश्चित करने के लिए बोझिल है। – Nobody

+0

@ नोबॉडी: आप सही हैं। मैं कुछ बिंदु पर अद्यतन या हटा दूंगा। –

0

दोनों कार्यक्रमों में एक ही कक्षा को साझा करने के लिए एक आसान दृष्टिकोण हो सकता है।

पुन: उपयोग ओओपी के उद्देश्यों में से एक है।

एक वर्ग जो मानचित्र को समाहित करता है और इसकी प्रारंभिकता को बनाया जा सकता है और फिर सी ++ प्रोग्राम दोनों में उपयोग किया जा सकता है।

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