2016-02-15 4 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

Specialize первые два случая:

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

@songyuanyao: изменил его, хотя способ был скомпилирован (возможно, по ошибке) в 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; 
}; 

Это более масштабируемым, если вы решили поддержать более трех элементов, но в противном случае, ответ Вирсавии, вероятно, более подходящим.