超スマートポインタ

メンバの型とオフセットを記録する方式はあまり効率が良くないかもしれない。特にコンパイル時にデストラクタが確定しにくいような。グレイリスト登録と復帰は超スマートポインタをメンバに持つクラスがそれぞれ実装するというのはどうだろう。

class Base {
private:
  smart_ptr<X> ptr;
public:
  virtual void gray(GrayList list) {
    ptr.gray(list);
  }
}

のように。ちなみにGrayListの方で分岐して、登録・復帰を一つの関数にまとめているとする。この超スマートポインタをメンバとして持っていて循環検出をしたい場合にはBaseを基底クラスとして持つ、という条件くらいなら科しても良かろう。