2016-02-15 19 views
7

Bir şablon sınıfında, bir özellik takma adını şablona koşullu olarak nasıl tanımlarsınız?Şablon sınıfı 0'daki koşullu başvuru bildirimi

Örnek:

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 
}; 

bu koşullu beyanı mümkün mü? eğer evet, nasıl?

cevap

7

İhtisas ilk iki olgu: Daha sonra aynı temel sınıfa varsa

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]; 
}; 

ortak işlevsellik için polimorfizm ölçülü miktarda kazanç. Eğer dizinin olmadan yapabiliyorsa

+0

Ayrıca, "Boyutlar" ın geçerli olduğundan emin olmak için birincil şablonda bir "static_assert" da isteyebilir. – TartanLlama

+0

Güzel, ancak, neden uzmanlıkların birbirlerinden türetilmediğini? –

+0

@songyuanyao: MSVC2013'te derlediğim şekilde (belki de hatada) olsa da değiştirdim. – Bathsheba

2

, bunu yapabilirdi: Bu aksi takdirde üçten fazla unsurları desteklemeye karar verirseniz daha ölçeklenebilir, ama

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; 
}; 

, Bathsheba cevabı muhtemelen daha uygundur.

İlgili konular