2011-08-14 18 views
9

सी ++ 0x वैरैडिक टेम्पलेट्स प्रस्ताव पत्र Link में एक वर्ग का एक उदाहरण है जो मनमाना संख्याओं का समर्थन करता है। मैंने इसे नीचे कॉपी किया है:वैराडिक टेम्पलेट्स बहुआयामी ऐरे कंटेनर

template<typename T, unsigned PrimaryDimension, unsigned... Dimensions> 
class array { /* implementation */ }; 

array<double, 3, 3> rotation matrix; // 3x3 rotation matrix 

दुख की बात है कि कार्यान्वयन प्रदान नहीं किया गया है। जैसा कि मैं विविध टेम्पलेट्स के लिए अपेक्षाकृत नया हूं, मुझे इस कंटेनर के कार्यान्वयन को देखने में दिलचस्पी होगी।

किसी भी व्यक्ति को धन्यवाद जो सरल कार्यान्वयन प्रदान कर सकता है।

उत्तर

15

यहाँ एक बहुत ही सरल कार्यान्वयन (gcc4.6.1 साथ संकलित) कि प्रत्यावर्तन सरणी प्रकार सही होने में शामिल दर्शाता है - अगर कुछ अन्य विशिष्ट कार्यान्वयन विस्तार आप में रुचि रखते हैं है, तो कृपया हमें बताएं:

template<class T, unsigned ... RestD> struct array; 

template<class T, unsigned PrimaryD > 
    struct array<T, PrimaryD> 
{ 
    typedef T type[PrimaryD]; 
    type data; 
    T& operator[](unsigned i) { return data[i]; } 

}; 

template<class T, unsigned PrimaryD, unsigned ... RestD > 
    struct array<T, PrimaryD, RestD...> 
{ 
    typedef typename array<T, RestD...>::type OneDimensionDownArrayT; 
    typedef OneDimensionDownArrayT type[PrimaryD]; 
    type data; 
    OneDimensionDownArrayT& operator[](unsigned i) { return data[i]; } 
}; 

int main() 
{ 
    array<int, 2, 3>::type a4 = { { 1, 2, 3}, { 1, 2, 3} }; 
    array<int, 2, 3> a5{ { { 1, 2, 3}, { 4, 5, 6} } }; 
    std::cout << a5[1][2] << std::endl; 

    array<int, 3> a6{ {1, 2, 3} }; 
    std::cout << a6[1] << std::endl; 

    array<int, 1, 2, 3> a7{ { { { 1, 2, 3}, { 4, 5, 6 } } }}; 
    std::cout << a7[0][1][2] << std::endl; 
} 
+0

उत्तर, फैसल के लिए धन्यवाद। यह सिर्फ अविश्वसनीय है। बहुत खूबसूरत। मैंने मुख्य रूप से पूछा क्योंकि मेरे पास एक निश्चित आकार की बहुआयामी सरणी लाइब्रेरी है (यहां लिंक करें: http://code.google.com/p/fsma/) जो अंतर्निहित 2 डी और 3 डी सरणी के आसपास पतले रैपर प्रदान करता है और std के समान है: : सरणी। मैं सोच रहा था कि एक संस्करण को कैसे कार्यान्वित किया जाए जो उन पर मानक समिति पेपर पढ़ने के बाद वैरिएडिक टेम्पलेट्स का उपयोग करके मनमानी संख्याओं के आयामों की अनुमति देता है। जब तक मैं आपका जवाब नहीं पढ़ता तब तक मैं विविध टेम्पलेट्स की शक्ति से अनजान था! – Ricky65

+0

2011-अगस्त -14 टिप्पणी के लिए @ faisal-vali द्वारा, मुझे यकीन नहीं है कि आप क्या निर्माण करने की कोशिश कर रहे हैं। 'टेम्पलेट <क्लास टी, int ... डी> सरणी ' 'arrayX ' दिया 'लंबा, 2, 3, 5 जैसे कुछ का अनुवाद नहीं करेगा पैरामीटर के रूप में। विविधता पैरामीटर को अल्पविराम से अलग सूची में विस्तार करना होता है, जो नेस्टेड सरणी सीमाएं योग्य नहीं होती हैं। – CTMacUser

+0

@CTMacUser हाँ हां, आप सही हैं - मेरी टिप्पणी गैर-समझी है और इसे परेशान होना चाहिए। –

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