2016-02-15 11 views
7

में सशर्त संदर्भ घोषणा टेम्पलेट कक्षा में, टेम्पलेट में सशर्त रूप से किसी संपत्ति उपनाम को परिभाषित करने के लिए कैसे करें?टेम्पलेट वर्ग

उदाहरण:

template<class Type, unsigned int Dimensions> 
class SpaceVector 
{ 
public: 
    std::array<Type, Dimensions> value; 
    Type &x = value[0]; // only if Dimensions >0 
    Type &y = value[1]; // only if Dimensions >1 
    Type &z = value[2]; // only if Dimensions >2 
}; 

इस सशर्त घोषणा संभव है? यदि हां, तो कैसे?

उत्तर

7

विशेषज्ञ पहले दो मामलों:

template<class Type> 
class SpaceVector<Type, 1> 
{ 
public: 
    std::array<Type, 1> value; // Perhaps no need for the array 
    Type &x = value[0]; 
}; 

template<class Type> 
class SpaceVector<Type, 2> 
{ 
public: 
    std::array<Type, 2> value; 
    Type &x = value[0]; 
    Type &y = value[1]; 
}; 

आप आम कार्यक्षमता के लिए बहुरूपता का एक मापा राशि हासिल आप एक आम आधार वर्ग तो है।

+0

प्राथमिक आयाम में 'static_assert' भी चाहते हैं ताकि यह सुनिश्चित किया जा सके कि 'आयाम' मान्य है। – TartanLlama

+0

अच्छा, हालांकि, विशेषज्ञों को एक दूसरे से क्यों नहीं मिला है? –

+0

@ सोंग्युन्याओ: इसे बदल दिया, हालांकि जिस तरह से मैंने इसे संकलित किया था (शायद त्रुटि में) MSVC2013 में। – Bathsheba

2

आप सरणी के बिना कर सकते हैं, तो आप ऐसा कर सकते हैं:

template<class Type, std::size_t Dimension> 
class SpaceVector 
{ 
public: 
    Type x; 
}; 

template<class Type> 
class SpaceVector<Type, 2> : public SpaceVector<Type,1> 
{ 
public: 
    Type y; 
}; 

template<class Type> 
class SpaceVector<Type, 3> : public SpaceVector<Type,2> 
{ 
public: 
    Type z; 
}; 

अगर आप तीन से अधिक तत्वों का समर्थन करने का फैसला को और अधिक विश्वसनीय है, लेकिन अन्यथा, बतशेबा के जवाब शायद और अधिक उपयुक्त है।

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