2009-10-02 17 views
10

मैं कुछ इस तरह seing याद किया जा रहा है:परिवर्तनीय लंबाई टेम्पलेट तर्क सूची?

template <ListOfTypenames> 
class X : public ListOfTypenames {}; 

है कि, एक्स टेम्पलेट तर्क के रूप में पारित typenames की एक चर लंबाई सूची से इनहेरिट करती है। यह कोड निश्चित रूप से काल्पनिक है।

मुझे इसके लिए कोई संदर्भ नहीं मिल रहा है, हालांकि। क्या यह संभव है? क्या यह सी ++ 0 एक्स है?

उत्तर

23

आप इसे वर्तमान सी ++ में कर सकते हैं। आप टेम्पलेट मानकों का एक "बड़ा पर्याप्त" नंबर देते हैं, और आप उन्हें चूक दे:

class nothing1 {}; 
class nothing2 {}; 
class nothing3 {}; 

template <class T1 = nothing1, class T2 = nothing2, class T3 = nothing3> 
class X : public T1, public T2, public T3 {}; 

या आप और अधिक परिष्कृत और उपयोग प्रत्यावर्तन मिल सकती है। सबसे पहले आप टेम्पलेट आगे की घोषणा:

class nothing {}; 

template <class T1 = nothing, class T2 = nothing, class T3 = nothing> 
class X; 

तो फिर तुम इस मामले में जहां सभी मापदंडों डिफ़ॉल्ट हैं के लिए विशेषज्ञ:

template <> 
class X<nothing, nothing, nothing> {}; 

तो फिर तुम ठीक से सामान्य टेम्पलेट को परिभाषित (पहले आप केवल आगे है जो -declared):

template <class T1, class T2, class T3> 
class X : public T1, public X<T2, T3> 

सूचना कैसे आधार वर्ग में, आप एक्स के वारिस, लेकिन आप पहले पैरामीटर याद आती है। तो वे सभी एक ही स्थान पर स्लाइड करते हैं। आखिरकार वे सभी डिफ़ॉल्ट होंगे, और विशेषज्ञता में लाएगा, जो किसी भी चीज का वारिस नहीं करता है, इस प्रकार रिकर्सन को समाप्त कर देता है।

अद्यतन: सिर्फ एक अजीब लग रहा है मैं इस से पहले की तरह कुछ तैनात था, and guess what...

+0

आप भी सिर्फ एक "कुछ नहीं" वर्ग – sellibitze

+0

@sellibitze इस्तेमाल कर सकते हैं - मैं में उपयोग के लिए सिर्फ एक "कुछ नहीं" वर्ग का उपयोग रिकर्सिव संस्करण। आप गैर-रिकर्सिव संस्करण में डिफ़ॉल्ट के लिए एक ही कक्षा का उपयोग नहीं कर सकते हैं, क्योंकि आपको "कुछ भी पहले से ही प्रत्यक्ष आधार वर्ग" त्रुटियां नहीं मिलेंगी। –

+0

मुझे समझ में नहीं आ रहा है: एक्स से विरासत में पहली पैरामीटर क्यों छोड़ते हैं? – Gili

19

की तरह आप C++ 0x Variadic Templates की बात कर रहे ध्वनि था। आप Loki से अलेक्जेंड्रेसक्यू के TypeList निर्माण का उपयोग करके भी वही प्रभाव प्राप्त कर सकते हैं।

मेरा मानना ​​है कि प्रश्न में विविध टेम्पलेट सिंटैक्स निम्न की तरह दिखेगा।

template <typename...T> 
class X : public T... {}; 
+13

यदि मुझे गलत नहीं है, तो आपको इस प्रकार को अनपैक करने की भी आवश्यकता होगी: 'सार्वजनिक टी ... {}; ' – UncleBens

2

टेम्पलेट की परिवर्तनीय संख्या अगले सी ++ मानक का हिस्सा है। हालांकि, यदि आप जीसीसी (संस्करण 4.3 से) का उपयोग कर रहे हैं तो आप इसका स्वाद प्राप्त कर सकते हैं। यहां एक list of available C++0x features in GCC है। आप वैराडिक टेम्पलेट्स की तलाश में हैं।

वैसे, यदि आपको ईरविकियर द्वारा वर्णित विरासत तंत्र को प्राप्त करने के औपचारिक संदर्भ की आवश्यकता है, तो यह C++ Templates पुस्तक पर है।

4

दूसरों पहले से ही उत्तर के रूप में, variadic टेम्पलेट्स अगले मानक का हिस्सा हैं, लेकिन मौजूदा C++ नकल करते जा सकता है। इसके लिए एक सुविधाजनक टूल Boost.MPL लाइब्रेरी का उपयोग करना है। अपने कोड में, आप एक एकल टेम्पलेट पैरामीटर लिखते हैं (चलो इसे नाम दें "टाइपलिस्ट"), और आपके टेम्पलेट के उपयोगकर्ता एक एमपीएल अनुक्रम में टाइपलिस्ट को लपेटते हैं। उदाहरण:

#include "YourType.h" 
#include "FooBarAndBaz.h" 
#include <boost/mpl/vector.hpp> 

YourType<boost::mpl::vector<Foo, Bar, Baz> > FooBarBaz; 

"YourType" के कार्यान्वयन में, आप विभिन्न metafunctions साथ Typelist में तत्वों का उपयोग कर सकते हैं। उदाहरण के लिए, at_c<Typelist, N>N सूची का वही तत्व है।एक और उदाहरण के रूप में, अपने प्रश्न में "एक्स" वर्ग के साथ inherit_linearly रूप में लिखा जा सकता है:

//Warning: Untested 
namespace bmpl = boost::mpl; 
template<class Typelist> 
class X : bmpl::inherit_linearly<Typelist, bmpl::inherit<bmpl::_1, bmpl::_2> >::type 
{ 
... 
}; 
संबंधित मुद्दे