ゆとりーなの日記

日記的な事を書いて行くと思はれる

virtual付け過ぎないのもあれだけど

その1 RPGのヒットポイントもオブジェクトだ!を読んでて、virtual取っ払い症が発病しました。

#include <iostream>
#include <boost/variant.hpp>

class normal_hit_point {
 public:
  explicit normal_hit_point(const int hp = 0) : hp_(hp) {}

  int hit_point() const {
    return hp_;
  }

 private:
  int hp_;
};

enum difficulty {
  easy, normal, hard
};

class difficulty_hit_point {
 public:
  difficulty_hit_point(const difficulty dif, const int hp) : dif_(dif), hp_(hp) {}

  int hit_point() const {
    return dif_ == hard ? static_cast<double>(hp_) * 1.1 : dif_ == normal ? hp_ : static_cast<double>(hp_) * 0.9;
  }

 private:
  difficulty dif_;
  int hp_;
};

typedef boost::variant<normal_hit_point, difficulty_hit_point> hit_point_model;

struct get_hit_point : public boost::static_visitor<int> {
	template<typename T>
	int operator() (const T &t) const {
    return t.hit_point();
  }
};

class character {
 public:
  void set_hit_point(const hit_point_model &model) {
    model_ = model;
  }

  int hit_point() const {
    return boost::apply_visitor(get_hit_point(), model_);
  }

 private:
  hit_point_model model_;
};

int main() {
  character c;
  normal_hit_point n(3000);
  c.set_hit_point(n);
  std::cout << c.hit_point() << std::endl;
  difficulty_hit_point d(hard, 3500);
  c.set_hit_point(d);
  std::cout << c.hit_point() << std::endl;
  return 0;
}

出力

3000
3850

ここまでする意味があるかどうかは知りません。