2012-10-21 17 views
5

घोषित करने के लिए कैसे मैंने एक स्थिति है कि इस काल्पनिक उदाहरण की तरह है:एक आत्म संदर्भित टेम्पलेट प्रकार

template<class TFeature> struct Controller {}; 

template<class TController,typename T> struct Feature { 
    typedef Feature<TController,T> FeatureType; 
}; 

typedef Controller<Feature::FeatureType,int> DefaultController; 

नियंत्रक सुविधाओं को स्वीकार करने के टेम्प्लेटेड है और मेरी समस्या सुविधाओं में से कुछ के प्रकार की जरूरत है वह यह है कि एक टेम्पलेट पैरामीटर के रूप में नियंत्रक। यह नमूना की आखिरी पंक्ति पर टाइपिफ को संकलित नहीं करता है।

क्या यह संभव है या मुझे डिज़ाइन पर पुनर्विचार करने की आवश्यकता है?

+1

@RondogiannisAristophanes, मुझे लगता है कि सवाल का सवाल है। – bdonlan

+0

आप संरचना के बाहर 'फ़ीचर टाइप' क्यों घोषित नहीं कर सकते? – alestanis

+1

-1 प्रस्तुत कोड * अवैध * है, एक औपचारिक एक के लिए दो वास्तविक टेम्पलेट तर्क का उपयोग कर। यह 'फीचर टाइप' के साथ 'फीचर' टाइपिंग' के साथ भी * अर्थहीन * है। –

उत्तर

2

इसे पूरा करने के लिए आपको कुछ मेटा प्रोग्रामिंग जादू करना चाहिए (और मुझे विश्वास है कि यह एक आसान काम नहीं है)। लेकिन अगर आप वास्तव में इसे nead और boost का उपयोग कर एक विकल्प है के लिए आप boost::mpl पर एक नज़र डालें और आप कुछ इस तरह हो सकता है:

template< class ControlerT > 
struct FeatureEx { 
    typedef ControlerT controler_type; 
}; 
template< class FeatureT > 
struct ControlerEx { 
    typedef ControlerEx<FeatureT> this_type; 
    typedef typename boost::mpl::apply< 
     FeatureT, boost::mpl::identity<this_type> 
    >::type feature_type; 

    feature_type const& get_feature() const {return f_;} 

private: 
    feature_type f_; 
}; 

typedef ControlerEx<FeatureEx<boost::mpl::placeholders::_1> > DefaultControler; 
+0

मुझे विश्वास है कि यह वह दृष्टिकोण है जो मेरे लिए काम कर सकता है और मैंने इसे अपने स्वीकृत उत्तर के रूप में चिह्नित किया है। उत्तर देने के लिए समय लेने वाले सभी के लिए बहुत बहुत धन्यवाद। –

0

एक विकल्प एक typedef के बजाय एक डमी उपवर्ग उपयोग करने के लिए होगा:

struct DefaultController : public Controller<Feature<DefaultController,int>::FeatureType> {}; 
1

आप Controller वर्ग दो टेम्पलेट मापदंडों के गुजर रहे हैं, लेकिन आप इसे केवल एक ही ले जाने की घोषणा की है। क्या आपको निम्न की तरह कुछ चाहिए?

typedef Controller<Feature<Controller<int>,int>::FeatureType> DefaultController; 
0

ऐसा लगता है कि आप नियंत्रक टेम्पलेट को 2 पैरा पास करने का प्रयास कर रहे हैं, जबकि यह केवल एक को स्वीकार कर सकता है।

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