1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| template <typename CRTP, typename V, typename F>
class IPositionnable{
public:
using value_t = V;
using flag_t = F;
using pos_t = Position<value_t, flag_t>;
void moveTo(pos_t const & newPos){
pos_ = newPos;
}
template <typename U = F,
typename = typename std::enable_if<std::is_same<U, Flag2D>::value>::type>
void move(value_t diffX, value_t diffY){
pos_=pos_t{pos_.x()+diffX, pos_.y()+diffY};
}
template <typename U = F,
typename = typename std::enable_if<std::is_same<U, Flag3D>::value>::type>
void move(value_t diffX, value_t diffY, value_t diffZ){
pos_=pos_t{pos_.x()+diffX, pos_.y()+diffY, pos_.z()+diffZ};
}
value_t x() const{
return pos_.x();
}
value_t y() const{
return pos_.y();
}
template <typename U = F,
typename = typename std::enable_if<std::is_same<U, Flag3D>::value>::type>
value_t z() const{
return pos_.z()
}
protected:
/* il n'y a de toutes façons pas de sens à permettre la destruction d'une instance
* dérivée alors qu'on la connait comme étant du type de l'interface,
* un destructeur protégé et non virtuel fait donc pleinement l'affaire
*/
~IPositionnable() = default;
/* et tant qu'à faire, pour respecter le principe du miroir */
IPositionnable(pos_t const & p=pos_t{}):pos_(p){
}
private:
pos_t pos_;
}; |
Partager