[解決済み] 一発勝負の'if'を書くための最もエレガントな方法
2022-06-01 10:49:30
質問
C++ 17以降では
if
ブロックを書くことができます。
#include <iostream>
int main() {
for (unsigned i = 0; i < 10; ++i) {
if (static bool do_once = true; do_once) { // Enter only once
std::cout << "hello one-shot" << std::endl;
// Possibly much more code
do_once = false;
}
}
}
考えすぎかもしれませんし、他に解決する方法があることも承知していますが、それでも、このように何とか書くことは可能でしょうか。
do_once = false
は必要ないでしょうか?
if (DO_ONCE) {
// Do stuff
}
ヘルパー関数を
do_once()
を含む
static bool do_once
を含んでいますが、その同じ関数を別の場所で使いたいとしたらどうでしょうか?このような場合には
#define
? そうでないことを祈ります。
どのように解決するのですか?
使用方法
std::exchange
:
if (static bool do_once = true; std::exchange(do_once, false))
真偽値を逆にして短くすることができます。
if (static bool do_once; !std::exchange(do_once, true))
しかし、これを多用するのであれば、派手にやらずにラッパーを作成しましょう。
struct Once {
bool b = true;
explicit operator bool() { return std::exchange(b, false); }
};
といった感じで使う。
if (static Once once; once)
この変数は条件の外から参照されることはないので、この名前はあまり意味がありません。のような他の言語からヒントを得て
Python
のような他の言語からヒントを得て
_
と書くことができます。
if (static Once _; _)
さらなる改善点:BSSセクションを活用する(@Deduplicator)、すでに実行したときのメモリ書き込みを避ける(@ShadowRanger)、何度もテストする場合は分岐予測ヒントを与える(質問のように)。
// GCC, Clang, icc only; use [[likely]] in C++20 instead
#define likely(x) __builtin_expect(!!(x), 1)
struct Once {
bool b = false;
explicit operator bool()
{
if (likely(b))
return false;
b = true;
return true;
}
};
関連
-
[解決済み】構造体のベクター初期化について
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] C++でintをstringに変換する最も簡単な方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】C++でオブジェクトのリストを反復処理する方法とは?
-
[解決済み] Pythonのシングルアンダーコア"_"変数の目的は何ですか?