1

たとえば、一部のコードに関数呼び出しがあり、好きなように有効/無効にしたいと考えています。

通常、if を使用するだけで済みますが、関数を実行できるかどうかを毎回チェックすることになり、これは望ましくありません。コードでそのチェックを行わないようにしたいだけです。

ifdef ブロックは、ごちゃごちゃしていて非常に汚れている可能性があり、積み重なってコードが読みにくくなります。

ある種のテンプレートでこれを解決できませんか? 複数のラムダを作成して、必要な関数呼び出しの各バージョンをビルドできることはわかっています。

これは静的な if の意味ですか? 私の考えでは、私がやりたいのは自己変更コードであり、それが良いアイデアなのか、それとも可能かどうかはまったくわかりません。

4

4 に答える 4

1

はい、あなたが望むことを行う方法はありますが、それらはランタイムであるため、コストを推測します。以下に示すものがifよりも速いか遅いかについては...プロファイルして確認する必要があります。逆参照の費用はかかりますが、余分なブランチは失われます。

関数ポインタ

複数のバージョンの関数 (または仮想関数を持つオブジェクト) を用意することで、これを解決できます。

例:

void stud(const char *) {}
void _log(const char *msg) { clog << msg << endl; };

void (*log)(const char *) = stud; 

void enable_logging()  { log = _log; }
void disable_logging() { log = stud; }

int main() {
    log("This will not be logged");
    enable_logging();
    log("This will be logged.");
}
于 2014-07-11T16:18:35.397 に答える