2012-06-15 17 views
6

टेम्पलेट में, मैं टेम्पलेट पैरामीटर को वास्तविक गैर-टेम्पलेट प्रकार पर ड्रिल करना चाहता हूं। तो:टेम्पलेट पैरामीटर वर्ग निकालने के लिए सी ++ टाइप गुण

template <typename T> 
struct MyTemplate 
{ 
    // sadly there's no extract_Base 
    typedef typename extract_base<T>::MyType WorkType; 
}; 
struct X {}; 
template <typename T> struct Templ {}; 
//MyTemplate<Templ<X>>::WorkType is X; 
//MyTemplate<X>::WorkType is X; 

एकमात्र समाधान मैं देख रहा हूँ अंदर सहायक प्रकार को परिभाषित करने के बिना वहाँ ऐसा करने के लिए कोई तरीका है std :: वेक्टर की तरह वास्तविक आधार प्रकार को परिभाषित करने < एक्स > :: VALUE_TYPE एक्स है लेकिन मैं उत्सुक हूँ है प्रत्येक गंतव्य टेम्पलेट।

मैंने कुछ देखा http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2965.html लेकिन यह मसौदा है? और मुझे काफी कुछ नहीं मिला है।

हाँ मुझे पता है कि कई विरासत हैं, लेकिन सरल मामले के लिए भी यह अच्छा होगा।

अद्यतन: नवाज समाधान मेरे लिए बहुत अच्छा काम करता है, और विशिष्ट मामलों में विस्तार करना आसान है, उदाहरण के लिए

template<template<typename, typename> class X, typename T1, typename T2> 
struct extract_base <X<T1, T2>> //specialization 
{ 
    typedef T1 base; 
}; 

मैं भी t1/T2 पर is_base_of या अन्य फ़िल्टर लागू कर सकता हूं। तो यह एक्स < टी, यू > के लिए काम करता है - कम से कम जी ++ 4.6.7 के साथ।

+0

इसका विरासत या आधार वर्गों के साथ कुछ लेना देना नहीं है। –

+0

'std :: is_base_of' है लेकिन यह आपके उद्देश्यों को पूरी तरह अनुरूप नहीं कर सकता है। – dirkgently

उत्तर

7

सबसे पहले, value_type को base के बजाय इसे कॉल करें, क्योंकि value_type उस प्रकार का वर्णन करने के लिए अधिक उपयुक्त शब्द प्रतीत होता है जिसे आप निकालना चाहते हैं।

आप इस का उपयोग कर सकते हैं:

template<typename T> 
struct extract_value_type //lets call it extract_value_type 
{ 
    typedef T value_type; 
}; 

template<template<typename> class X, typename T> 
struct extract_value_type<X<T>> //specialization 
{ 
    typedef T value_type; 
}; 

यह extract_value_type करने के लिए टेम्पलेट तर्क के रूप में रूप में लंबे समय से काम करना चाहिए या तो T या X<T> के रूप में है। हालांकि, यह X<T,U> के लिए काम नहीं करेगा। लेकिन फिर विविधतापूर्ण टेम्पलेट का उपयोग करके इसे C++ 11 में कार्यान्वित करना आसान है।

के रूप में यह प्रयोग करें:

template <typename T> 
struct MyTemplate 
{ 
    typedef typename extract_value_type<T>::value_type value_type; 
}; 

ऑनलाइन डेमो: http://ideone.com/mbyvj


सी ++ 11 में

अब, तुम वर्ग टेम्पलेट्स जो एक से अधिक लेने के साथ extract_value_type काम करने के लिए variadic टेम्पलेट का उपयोग कर सकते हैं टेम्पलेट तर्क, जैसे std::vector, std::set, std::list आदि

template<template<typename, typename ...> class X, typename T, typename ...Args> 
struct extract_value_type<X<T, Args...>> //specialization 
{ 
    typedef T value_type; 
}; 

डेमो: http://ideone.com/SDEgq

+0

"टेम्पलेट कक्षा एक्स" के साथ संकलित करता है और काम करता है! धन्यवाद। – queen3

+0

@ queen3: अब विविध समाधान देखें। – Nawaz

+0

हां, हालांकि एक्स मेरे लिए काम किया, अद्यतन देखें। फिर भी मुझे यही चाहिए था। – queen3

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