閑古鳥

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

Generic Template Method を動的な多態に対応させてみた

かなり強引に。

#include <memory>
class wrap_base
{
  struct holder_base
  {
    virtual void execute() = 0;
  };
  template<typename T>
  struct holder : public holder_base
  {
    T& instance;
    holder(T& value) : instance(value) {}

    void execute() { instance.execute(); }
  };

  std::auto_ptr<holder_base> obj_;
public:
  template<typename T>
  wrap_base(T& obj) : obj_(new holder<T>(obj)) {}

  template<typename T>
  wrap_base& operator=(T& obj)
  {
    obj_.reset(new holder<T>(obj));
    return *this;
  }

  void execute()
  {
    obj_->execute();
  }  
};

void main()
{
  // hoge, foo の実装は先の例と同じもの
  hoge h;
  foo f;

  wrap_base b = h;
  b.execute();

  b = f;
  b.execute();
}
一応動かすことはできましたが、 holder に使用したいメソッドが追加されるたびに変更が入ってしまうなど問題が多すぎて実用性は皆無ですね。これなら先ほどの、関数ひとつかませるやり方のほうがまだスマートな気がします。道は険しい……。