template

超スマートポインタのタグを[言語]にしたのは失敗だったかな。実装レベルの話まで[言語]タグにするのは変だもの。とりあえず、超スマートポインタの話は[言語]のまま進めて、派生した実装の話は[C++]タグにすることにした。
で、templateの話だ。

template<typename T>
class Holder {
private:
  T* ptgt;
public:
  Holder<T>(T* _ptgt):
    ptgt(_ptgt) {
  }
  ~Holder<T>() {
    delete ptgt;
  }
  void do_somthing() {
  }
}

というクラスがあるとする。色々なTのHolderに対してdo_something()するstd::vectorなどを作りたくなるときがある。javaならArrayListで良いのかもしれないが、C++でstd::vectorとするとエラーになる。
こういう場合は一つ基底クラスを作るしかないのだろうか。つまり、

class AbstractHolder {
protected:
  AbstractHolder() {
  }
  ~AbstractHolder() {
  }
public:
  virtual void do_somthing() {
  }
}
template<typename T>
class Holder: public AbstractHolder {
private:
  T* ptgt;
public:
  Holder<T>(T* _ptgt):
    AbstractHolder(),
    ptgt(_ptgt) {
  }
  ~Holder<T>() {
    delete ptgt;
  }
  void do_somthing() {
  }
}

という構成だ。AbstractHolderはインターフェースだと思えば悪くはないが、継承は減らしたいと思ったりもする。ううむ。