クラスのすべてのメソッドが最初に他のメソッドを呼び出すことを保証するには?
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();
関連
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】Enterキーを押して続行する
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み】C++のSTLはなぜテンプレートに大きく依存しているのですか?(そして*インターフェイス*にはない)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】デバッグアサーションに失敗しました