4

まず第一に、私は第一人者のC++プログラマーではないと言わせてください。私はC++で数年の経験がありますが、私の主な分野は.NET / C#です。

C++で動的プロキシ/ラッパークラスを作成する方法を検討しています。特に、私が達成したいのは、メソッド呼び出しをインターセプトすることです。この種のトリックはJava/.NETの世界では一般的ですが、C++にはReflectionがありません。

ラッパーを作成し、->演算子のオーバーロードを介してメソッド呼び出しをインターセプトする方法を説明するオンラインチュートリアルを見つけました。

class Person{
  std::string mName;
  Person(std::string pName): mName(name){}
  void printName(){
     std::cout << mName << std::endl;
  }

};

template <class T >
class Wrap {
     T * p ;
     public:
             Wrap (T * pp ) :p (pp) { }
             Call_proxy <T> operator ->() {
                   prefix ();
                   return Call_proxy<T>(p);
             }
};
template <class T >
class Call_proxy {
       T * p ;
       public :
              Call_proxy (T * pp ) :p (pp ){ }
              ˜Call_proxy () {
                     suffix ();
               }
               T * operator ->() {
                          return p ;
                }
 };

このサンプルからわかるように、呼び出しの前後にメソッド呼び出しイベントをキャッチできますが、私にとって明確ではないのは、どのメソッドが呼び出されているかを検出する方法です。それは可能ですか?

ありがとう

アップデート

わかりました。わかりやすくするために、実装が本当に動的であるかどうかは気にしません。スマートポインタに似たラッパークラスを持つことは私にとっては問題ありません。

4

1 に答える 1

1

いいえ。これは特に邪魔にならないように設計されています。ラッパーが行うのは、プレフィックスとサフィックスの呼び出しを容易にし、参照されているオブジェクトを返して、指定された関数を呼び出すことができるようにすることだけです。-> 演算子がオーバーロードされている場合、object->function() は object.operator->()->function() に展開されます。

これは Stroustrup が書いた論文へのリンクです。非常に有益ですhttp://www.stroustrup.com/wrapper.pdf

于 2012-11-19T13:28:40.600 に答える