2012-05-03 23 views
6

मुझे हाल ही में एक समस्या आई है। मुझे वास्तव में लगता है कि इसे हल नहीं किया जा सकता है क्योंकि मैं इसे बनाना चाहता हूं, लेकिन अगर यह हो तो यह काफी आसान होगा। वैसे भी, यहां समस्या है:टेम्पलेट विशेषज्ञता उपनाम

मैं आपको एक उदाहरण दूंगा जो मैंने कुछ दिनों पहले इस मंच पर देखा है क्योंकि इसके साथ व्याख्या करना आसान होगा। मान लीजिए कि मैं एक टेन्सर struct बनाने के लिए कोशिश कर रहा हूँ चलो, इस तरह से:

template <int N> 
struct Tensor 
{ 
    Tensor<N - 1> x; 
    Tensor<N - 1> y; 
    Tensor<N - 1> z; 
}; 

अनंत प्रत्यावर्तन बचने के लिए, मैं = 1.

template<> 
struct Tensor<1> 
{ 
    double x; 
    double y; 
    double z; 
}; 

असल में, जब एन के लिए टेम्पलेट विशेषज्ञता लिखने के लिए होता है एन = 1, यह टेंसर वास्तव में एक वेक्टर (भौतिक एक) है। मान लीजिए कि मैं पहले से ही एक वेक्टर struct इस तरह से परिभाषित किया है दो:

struct Vector 
{ 
    double x; 
    double y; 
    double z; 
}; 

यह struct बिल्कुल टेन्सर < 1 की तरह है>। चूंकि वेक्टर संरचना पहले से मौजूद है और, मान लें कि मैंने इसे स्वयं लागू नहीं किया है, मैं वेक्टर संरचना के उपनाम को टेंसर < 1> बनाने में सक्षम होना चाहता हूं। एक टाइपपीफ की तरह। तो, मैं इसे इस तरह से करना चाहते हैं:

// C++03 
typedef Vector Tensor<1>; 

// or C++11 
using Tensor<1> = Vector; 

इस तरह, टेन्सर < 1> और वेक्टर ठीक उसी struct होगा, तो यह मैं इस कार्यक्रम में एक और के बजाय एक इस्तेमाल कर सकते हैं हैं जहाँ भी मैं चाहता हूँ और मुझे दो बार एक ही संरचना लिखना नहीं होगा।

हालांकि, इस तरह एक टेम्पलेट विशेषज्ञता को परिभाषित करना वास्तव में असंभव है। अगर ऐसा होता, तो मैं वहां सवाल नहीं पूछूंगा।

नोट: मैं जानता हूँ कि पिछले उदाहरण एक अच्छा एक के बाद से हम अभी भी यह कर सकते हैं नहीं है:

using Vector = Tensor<1>; 

लेकिन यह काफी कष्टप्रद है अगर मैं दो अलग अलग structs की विशेषज्ञता के साथ यह करना चाहते हैं।

using Circle<2> = Hypersphere<2>; 

तो, योग करने के लिए: वहाँ एक और एक के उपनाम के रूप में यह परिभाषित करते हुए टेम्पलेट विशेषज्ञताओं बनाने के लिए एक रास्ता है उदाहरण के लिए, जब एक ज्यामिति पुस्तकालय है कि एन आयामी रिक्त स्थान में ज्यामिति की गणना कर सकता है लेखन?

template<> 
class Tensor<0>: public Scalar {}; 

template<> 
class Tensor<1>: public Vector {}; 

template<> 
class Tensor<2>: public Matrix {}; 

ध्यान दें कि यह विरासत का दुरुपयोग क्योंकि आप एक है-एक रिश्ते मॉडल कर रहे हैं नहीं है:

उत्तर

8

को देखते हुए विरासत कक्षाएं अदिश, सदिश और आव्यूह, आप विरासत इस्तेमाल कर सकते हैं।

+0

हाँ, मैंने पहले ही इसके बारे में सोचा था, लेकिन अगर मैंने ऐसा किया, तो कक्षाएं "सटीक" नहीं होंगी। मेरा मतलब है कि मुझे एक प्रकार से दूसरी तरफ चर को पास करने के लिए कास्ट और डाउनकास्ट करना होगा:/ मुझे पता है कि यह सिर्फ एक विवरण है और शायद इसे उन वर्गों को सोचने के लिए सुरक्षित प्रकार के रूप में नहीं माना जाता है, लेकिन यह बिल्कुल विवरण है मैं पराजित करना चाहता हूं। वैसे भी धन्यवाद :) – Morwenn

+0

@ मॉर्वेन अधिक सामान्यता के लिए, आपके उदाहरण को दो टेम्पलेट पैरामीटर की आवश्यकता होगी: 'टेम्पलेट क्लास टेंसर । यहां, डी स्थानिक आयामों की संख्या होगी। – TemplateRex

+0

हां, लेकिन मैं सिर्फ एक वाक्यविन्यास समस्या का पर्दाफाश करने के लिए इस उदाहरण को दिखाता हूं। मैं स्वयं या कुछ भी टेंसर का उपयोग नहीं करता हूं।सी ++ संभावनाओं के बारे में मेरे दिमाग को साफ़ करना सिर्फ ^^ " – Morwenn

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