というわけで、一応動くようになったわけですが、別に倉庫番がやりたかったわけではなくて、倉庫番の問題を作りたかったんですね。倉庫番の問題というのはどうやって作るのか。どんな問題が良くて、どんな問題が良くないのか。
とりあえず一番単純なの。プレイは枠内をクリック。
######## #O B @ # ########
単純すぎ。
適当に五つほど箱を置いてみた。
############## #OO # OOO# #### B # # # # ### B## # B# # # # @ # # # # ### #B #B # # # # ##############
うーん、クリア不可能だ(と思う)。あと、やはり単純というか、すぐに結果が見えてしまうところも気になる。
ここで、最初から作り直すか、それとも、修正してみるか。
############## #OO # OOO# # ## B # # # # ### B## # B# # # # @ # # # ### #B #B # # # # ##############
クリアできるように修正してみた。壁に一つ穴を開けてはプレイしてクリアできるかどうか考えた。二つ開けて箱を動かしながら少し考えた時点でクリアできることに気がついた。気がつくとちょっと嬉しい。意外と難しくね?
というわけで、今日発見した制作メソッド。
もはやIEのことは全く考えておりません。
上のテキスト領域はキーフォーカス固定用。他に良い方法が分からなかったので仕方なく。
template<typename PixelType>
struct Processor
{
static void proc(PixelType *p)
{
proc_inner<PixelType::HAS_COLOR>(p);
}
private:
template<bool SUPPORTED_TYPE>
static void proc_inner(PixelType *p)
{
// Do not anything.
}
template<> // Error
static void proc_inner<true>(PixelType *p)
{
p->setRGB(1,0,0);
}
};
げー、これって二重の意味で規格違反だったのね。VCでは通るから自然に使ってた。クラススコープでtemplate<>と書けない(C++03 14.7.3)のと、外側のクラステンプレートを明示的に特殊化せずに、それに囲まれたクラスメンバテンプレートを明示的に特殊化してはならない(C++03 14.7.3/18)のと。
入れ子クラスの部分特殊化はできるのか……。うーん、面倒くさい。