2009-11-10 14 views
15

मैं एसटीएल कंटेनर द्वारा रखे गए तत्वों का प्रकार कैसे प्राप्त कर सकता हूं?एसटीएल कंटेनर में तत्व का प्रकार टाइप करें - सी ++

+1

वास्तव में आप यहां क्या करने की कोशिश कर रहे हैं? चूंकि सी ++ स्थिर रूप से टाइप किया गया है, इसलिए आपको आमतौर पर पता होना चाहिए कि तत्व किस प्रकार हैं (वेक्टर , उदाहरण के लिए, इनट्स रखता है)। यदि आप समझाएंगे कि आप क्यों नहीं जानते कि किस प्रकार हैं, और आप उन्हें किसके लिए उपयोग करना चाहते हैं, तो इससे प्रश्न का उत्तर देने में मदद मिलेगी। –

+0

@ डेविड थॉर्नले: 'टेम्पलेट शून्य फू (std :: टेम्पलेट तर्क) {/ * यहां, हम नहीं जानते कि तत्वों का प्रकार क्या है * /} 'मुझे लगता है कि यह एक बहुत ही सामान्य स्थिति है। – jalf

+0

@Jalf: उस बिंदु पर सच है। लेकिन उस बिंदु पर foo() केवल एक अवधारणा है। लेकिन जैसे ही आप foo() का उपयोग करते हैं, आप भी इस प्रकार को जानते हैं। –

उत्तर

14

सामान्य रूप में कंटेनर यह X::value_type हो जाएगा के लिए है। सहयोगी कंटेनर के लिए यह X::mapped_type (X::value_typepair<const Key,T> से मेल खाता है)। यह सी ++ मानक के अध्याय 23 के अनुसार है।

यह जांचने के लिए कि आप प्रकार boost::is_same का उपयोग कर सकते हैं।

20
container::value_type 
+0

ठीक है कि पहले से ही बहुत अच्छा है, लेकिन मैं कंटेनर :: value_type द्वारा लौटाए गए दो मान प्रकारों की तुलना नहीं कर सकता। कोई सुझाव? –

+2

@ पैट्रिक: आप "value_type द्वारा दिए गए मानों" की तुलना नहीं कर सकते हैं क्योंकि value_type एक प्रकार है, मान नहीं। दो value_types की तुलना इस प्रकार एक स्थिर संचालन है, रनटाइम नहीं। जो आप प्राप्त करने का प्रयास कर रहे हैं उसके आधार पर, आप Boost.TypeTraits में "is_same" को देखना चाह सकते हैं: http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference /is_same.html –

+2

@ पैट्रिक: आपने वेक्टर में संग्रहीत तत्वों के * प्रकार * के लिए पूछा, तत्वों के * मूल्य * नहीं। आप मानों की तुलना कर सकते हैं, आप प्रकारों की तुलना नहीं कर सकते (कम से कम मेटाप्रोग्रामिंग चाल के बिना नहीं) - शायद आपको समझाया जाना चाहिए कि आप क्या करने की कोशिश कर रहे हैं। – jalf

0

किस अर्थ में? शायद आरटीटीआई और टाइपिड() का उपयोग कर?

शायद आप कंटेनर :: ValueType उपयोग करने के लिए जहां कंटेनर अपने कंटेनर का नाम (उदाहरण के लिए एसटीडी :: वेक्टर)

Alek

0

आपको हमें और अधिक संदर्भ देने की आवश्यकता है। यदि आपका मतलब है कि आप संकलन समय पर ज्ञात मान चाहते हैं तो इसे बदलना आसान है, फिर container::value_type का उपयोग करें।

typedef vector<int> coordinates; 

coordinates seq; 
fib::value_type elem = seq.back(); // it's easy to change int type 

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

यदि आप प्रकारों की तुलना करना चाहते हैं तो आप शायद रनटाइम पथ का नेतृत्व कर रहे हैं। सी ++ पॉलिमॉर्फिज्म का समर्थन करता है, जो अनिवार्य रूप से उस प्रकार की तुलना है जिसे आप देख रहे हैं - लेकिन भाषा में बनाया गया है। आप प्रकार के आधार पर निर्देशों का एक अलग सेट निष्पादित करना चाहते हैं? पॉलीमोर्फिज्म आपको ऑब्जेक्ट के प्रकार के आधार पर एक अलग फ़ंक्शन निष्पादित करने की अनुमति देता है। आपको कोड की एक अतिरिक्त पंक्ति नहीं लिखनी चाहिए - केवल एक सामान्य आधार से प्राप्त करें।

0

कुछ इस तरह का प्रयोग करें:

if (typeid(yourVariable)==typeid(YourClass)) //... 

Alek

+0

या dynamic_cast <> यदि आप विरासत श्रृंखला का परीक्षण करना चाहते हैं;) –

+0

लेकिन केवल तभी यदि आपके प्रकार में वर्चुअल विधियां हैं। –

+0

गतिशील_कास्ट का प्रयोग पॉलिमॉर्फिक पॉइंटर्स पर निश्चित रूप से किया जाता है। मैंने इसका जिक्र नहीं किया। तुम सही हो। इसे इंगित करने के लिए धन्यवाद;) –

0

दी प्रकार स्थिर जाना जाता है आप जाँच कर सकते हैं वे एक ही स्थिर टेम्पलेट विशेषज्ञता का उपयोग करके RTTI का उपयोग किए बिना कर रहे हैं। जैसे http://www.boost.org/doc/libs/1_40_0/libs/type_traits/doc/html/boost_typetraits/reference/is_same.html की तरह कुछ का उपयोग करें या यदि बढ़ावा उपलब्ध रोल नहीं है अपनी खुद की

3

जाँच हो रही है दो प्रकार के होते ही इस तरह प्राप्त किया जा सकता है या नहीं (RTTI बिना, मूल्य संकलन समय पर प्रयोग करने योग्य है):

template <class T, class U> 
struct same_type 
{ 
    static const bool value = false; 
}; 

//specialization for types that are the same 
template <class T> 
struct same_type<T, T> 
{ 
    static const bool value = true; 
}; 

//sample usage: 
template <class FirstContainer, class SecondContainer> 
bool containers_of_same_type(const FirstContainer&, const SecondContainer&) 
{ 
    return same_type< 
     typename FirstContainer::value_type, 
     typename SecondContainer::value_type 
    >::value; 
} 

#include <vector> 
#include <list> 
#include <iostream> 

int main() 
{ 
    std::cout << containers_of_same_type(std::vector<int>(), std::list<int>()); 
    std::cout << containers_of_same_type(std::vector<char>(), std::list<int>()); 
} 

(यह मूल रूप से boost::is_same काम करता है, कुछ कंपाइलरों के लिए कम से कम कामकाज।)

+0

वाह, यह बहुत चालाक है –

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