>>922
いいんですが、巷にはたくさんスマートポインタがあり、
対応するのにいちいちそれを書いていたらとっても大変です。

以下のクラスを書きました。
参照、ポインタ、スマートポインタを吸収し、ただのポインタとして保持します。

template <typename T>
class pointer
{
public:
template <class U>pointer(U &p) { init(p,&p); }

pointer(T &p) { p_=&p; }

pointer(T *p) { p_=p; }

operator T *() const { return p_; }

T *operator ->() const { return p_; }
private:
template <class U> void init(U &p,const T *) { p_=&p; }

template <class U> void init(U &p,const void *) { p_=&*p; }
private:
T *p_;
};