1. ホーム
  2. c++

クラスのすべてのメソッドが最初に他のメソッドを呼び出すことを保証するには?

2023-11-10 07:44:23

質問

私は:

class Foo {
   public:
      void log() { }

      void a() {
         log();
      }

      void b() {
         log();
      }
};

の各メソッドに、それぞれ別のメソッドを持たせる方法はありますか? Foo の各メソッドに log() を呼び出しますが、各関数の最初の行として明示的に log() をタイプする必要はないのでしょうか? 私は、各関数を調べて呼び出しが行われることを確認することなく、各関数に動作を追加できるように、また、新しい関数を追加するときに、コードが自動的に追加されるように、これを行いたいのです...。

これは可能なのでしょうか?マクロでこれを行う方法を想像できないので、どこから始めればよいのかわかりません...。私がこれまでに考えた唯一の方法は、コンパイルの前にファイルをスキャンしてソース コードを編集するように、" pre-build step" を追加することですが、これはあまり賢明とは思えません。

EDIT: 明らかにするために - 私は log() がそれ自身を明らかに呼び出すことを望んでいません。それはクラスの一部である必要はありません。

EDIT: 私は、クロスプラットフォームで動作するメソッドを使用し、stlのみを使用することを希望します。

どのように解決するのですか?

の珍しい特性のおかげで operator -> の前にコードを注入することができます。 の前にコードを注入することができます。 の前にコードを注入することができます。

// Nothing special in Foo
struct Foo {
    void a() { }
    void b() { }
    void c() { }
};

struct LoggingFoo : private Foo {
    void log() const { }

    // Here comes the trick
    Foo const *operator -> () const { log(); return this; }
    Foo       *operator -> ()       { log(); return this; }
};

使い方は以下のようになります。

LoggingFoo f;
f->a();

Coliruでライブを見る