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
こういう場合は一つ基底クラスを作るしかないのだろうか。つまり、
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はインターフェースだと思えば悪くはないが、継承は減らしたいと思ったりもする。ううむ。