template <typename T> class intrusive_ptr {
public:
 template <typename P...> void alloc(const P&... values) { m_pair = new Pair(values...); }
 T* operator->() { return m_pair == nullptr ? nullptr : &m_pair->obj; }
 T& operator*() { assert(m_pair != nullptr); return m_pair->obj; }

private:
 struct Pair {
  T obj;
  int cnt;
  template <typename P...>
  Pair(const P&... values) : obj(values...), cnt(1) { }
 };
 std::unique_ptr<Pair> m_pair;
};

カウントする部分は今はどうでもいいから書かないけど
こういう事はできるのかい?