閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

Generic Template Method を動的な多態に対応させるには

長いので続く。

#include <iostream>

template<class T>
struct base
{
  void execute()
  {
    static_cast<T&>(*this).execute();
  }
};

struct hoge : public base<hoge>
{
  void execute()
  {
    std::cout << "hoge" << std::endl;
  }
};
struct foo : public base<foo>
{
  void execute()
  {
    std::cout << "foo" << std::endl;
  }
};

// ↑のような Template Method の実装があったとして...

void main()
{
  hoge h;
  foo f;

  nantoka(h);
  nantoka(f);
}

// ↑みたいな使い方をするとき...

// どうする?
void nantoka(???)
{
}

まあ、関数呼び出しの場合は、以下のようにすれば動くのです。

// こうすれば動く
template<class T>
void nantoka(base<T>& obj)
{
  obj.execute();
}

しかし。

>

void main()
{
hoge h;
base& b = h; // これができない
}

これをうまく解決できないと、先に進むことができないため、試行錯誤しています。もう少し考えてみよう。