टेम्पलेट में, मैं टेम्पलेट पैरामीटर को वास्तविक गैर-टेम्पलेट प्रकार पर ड्रिल करना चाहता हूं। तो:टेम्पलेट पैरामीटर वर्ग निकालने के लिए सी ++ टाइप गुण
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 के साथ।
इसका विरासत या आधार वर्गों के साथ कुछ लेना देना नहीं है। –
'std :: is_base_of' है लेकिन यह आपके उद्देश्यों को पूरी तरह अनुरूप नहीं कर सकता है। – dirkgently