2016-02-15 5 views
7

In einer Template-Klasse, wie eine Eigenschaft Alias ​​bedingt auf die Vorlage definieren?Bedingte Referenz Erklärung in Template-Klasse

Beispiel:

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

Ist diese bedingte Erklärung möglich? wenn ja, wie?

Antwort

7

Spezialisieren die ersten beiden Fälle:

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

Wenn Sie eine gemeinsame Basisklasse haben, dann erhalten Sie eine abgemessene Menge an Polymorphismus für gemeinsame Funktionalität.

+0

könnte auch ein 'static_assert' in der primären Vorlage wollen sicherstellen, dass' Dimensions' gültig ist. – TartanLlama

+0

Schön, warum nicht die Spezialisierungen voneinander ableiten? –

+0

@songyuanyao: änderte es, obwohl die Art, wie ich es kompiliert hatte (vielleicht irrtümlich) in MSVC2013. – Bathsheba

2

Wenn Sie ohne das Array tun, könnten Sie dies tun:

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

Dieses skalierbarer ist, wenn Sie sich entscheiden, mehr als drei Elemente zu unterstützen, aber ansonsten Bathsebas Antwort ist wahrscheinlich besser geeignet.