2008-10-30 6 views
7

क्या typedef लंबे प्रकार के टेम्पलेट्स का उपयोग करना संभव है? उदाहरण के लिए:templated कक्षाओं के लिए typedefs?

template <typename myfloat_t> 
class LongClassName 
{ 
    // ... 
}; 

template <typename myfloat_t> 
typedef std::vector< boost::shared_ptr< LongClassName<myfloat_t> > > LongCollection; 

LongCollection<float> m_foo; 

यह काम नहीं करता है, लेकिन क्या एक समान प्रभाव प्राप्त करने का कोई तरीका है? मैं सिर्फ एक प्रकार की परिभाषा टाइप करने और पढ़ने से बचना चाहता हूं जिसमें मेरी संपादक विंडो की लगभग पूरी चौड़ाई शामिल है।

उत्तर

14

नहीं, वर्तमान में यह संभव नहीं है। यह सी ++ 0 एक्स AFAIK में संभव हो जाएगा।

सबसे अच्छा मैं के बारे में सोच सकता है

template<typename T> struct LongCollection { 
    typedef std::vector< boost::shared_ptr< LongClassName<T> > > type; 
}; 

LongCollection<float>::type m_foo; 
+0

यह काम करता है ... लेकिन आपको अपने सभी ctors को डुप्लिकेट करना होगा। –

+0

अपने सभी ctors डुप्लिकेट? – dalle

+0

वास्तव में, अपने सभी ctors डुप्लिकेट ?? – mch

3

आप मैक्रो जिस तरह से आप प्रत्येक प्रकार के लिए अलग-अलग typedefs करना है जाने के लिए नहीं करना चाहते हैं:

typedef std::vector< boost::shared_ptr< LongClassName<float> > > FloatCollection; 
typedef std::vector< boost::shared_ptr< LongClassName<double> > > DoubleCollection; 
+0

यह सब के बाद, std :: string std :: basic_string का typedef कैसे है। –

2

नहीं है, लेकिन आप एक 'सहायक' प्रकार का उपयोग करके निकट हो सकते हैं, यह example देखें।

1

इसकी वास्तव में क्या आप के लिए नहीं कह रहे हैं, लेकिन यह अपने वास्तविक स्थिति के आधार पर वांछित प्रभाव को प्राप्त हो सकता है:

template <typename myfloat_t> 
class LongClassName 
{ 
    // ... 
}; 

template <typename myfloat_t> 
class LongCollection : public std::vector< boost::shared_ptr< LongClassName<myfloat_t> > > 
{ 
}; 

आप कुछ निर्माताओं या ऑपरेटरों को अपनी आवश्यकताओं के आधार पर जोड़ने की जरूरत हो सकती है।

+0

एसटीएल संग्रह से प्राप्त नहीं किया जा रहा है बुरा माना जाता है? उनके पास वर्चुअल फ़ंक्शन नहीं हैं। मुझे लगता है कि एक सदस्य चर के रूप में उपयोग करके std :: वेक्टर के संदर्भ में LongCollection को लागू करना सुरक्षित होगा। निजी विरासत भी एक विकल्प हो सकता है। – mch

+0

इसे अच्छी प्रथा नहीं माना जाता है लेकिन यह वास्तव में उन समस्याओं का सामना नहीं करता है जब तक आप पॉलिमॉर्फिक उपयोग का इरादा नहीं रखते हैं। –

2

लियोन द्वारा दिखाया गया समाधान कैननिकल है। पृष्ठभूमि ज्ञान का बिट: इसे "(टेम्पलेट) मेटाफंक्शन कहा जाता है" क्योंकि यह मूल रूप से एक "फ़ंक्शन" होता है जिसे संकलन समय पर मूल्यांकन किया जाता है। मूल्यों के बजाय, यह प्रकारों से संबंधित है: इनपुट प्रकारों (प्रकार तर्क) की एक सूची है और "वापसी मूल्य" है: टाइपपीफ जो प्रकार का नाम "प्रकार" घोषित करता है।

"प्रार्थना" एक अलग वाक्य रचना के साथ सामान्य कार्य मंगलाचरण के लिए तुलनात्मक रूप से काम करता है, हालांकि: इस तरह के बूस्ट पुस्तकालयों के रूप में और यहां तक ​​कि एक ही बार में एसटीएल में

// Normal function 
result = f(args); 

// Metafunction 
typedef f<args>::type result; 

इस कोड निर्माण पुस्तकालयों में एक अक्सर इस्तेमाल किया मुहावरा है जगह: allocator_type::rebind<U>::other एक ही चीज़ को एकमात्र अंतर के साथ पूरा करता है कि टाइपपीफ type को other कहा जाता है।

+0

मुझे लगता है कि आपका मतलब है 'टेम्पलेट मेटाफंक्शन'। :) –

+0

हाँ, प्लस "पी"। ;-) धन्यवाद। –

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