「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > STLまたはブーストライブラリに依存せずに、C ++に\ "Defer \"機能を実装するにはどうすればよいですか?

STLまたはブーストライブラリに依存せずに、C ++に\ "Defer \"機能を実装するにはどうすればよいですか?

2025-01-27に公開
ブラウズ:278

How can you implement a \

c

の「延期」機能のカスタム実装、「defer」の概念は、最後に特定のアクションを実行することを含みます。コードの特定のスコープまたはブロックの。 STL(標準テンプレートライブラリ)とブーストライブラリは、この機能の組み込みの実装を提供しませんが、次のコードスニペットを使用してカスタムソリューションを作成できます:

#ifndef defer
struct defer_dummy {};
template  struct deferrer { F f; ~deferrer() { f(); } };
template  deferrer operator*(defer_dummy, F f) { return {f}; }
#define DEFER_(LINE) zz_defer##LINE
#define DEFER(LINE) DEFER_(LINE)
#define defer auto DEFER(__LINE__) = defer_dummy{} *[&]()
#endif // defer

usage:

deferマクロを特定の範囲内で使用して、その範囲が終了したときに実行されるコードブロックを定義できます。構文は次のとおりです。 //現在のスコープの最後に実行されるコード };

defer {
    // Code to be executed at the end of the current scope
};

次の例では、延期マクロはread_entire_file関数内で使用され、関数が終了したときに入力ファイルを自動的に閉じます:

を含めます #include bool read_entire_file(char *filename、std :: uint8_t *&data_out、std :: size_t *size_out = nullptr){ if(!filename) falseを返します。 auto file = std :: fopen(filename、 "rb"); if(!file) falseを返します。 Defer {std :: fclose(file); }; // raiiファイルラッパーを書く必要はありません。 // ...残りのコード }

#include 
#include 

bool read_entire_file(char *filename, std::uint8_t *&data_out, std::size_t *size_out = nullptr) {
    if (!filename)
        return false;

    auto file = std::fopen(filename, "rb");
    if (!file)
        return false;

    defer { std::fclose(file); }; // don't need to write an RAII file wrapper.

    // ... Remaining code
}

ゼロオーバーヘッド:
    他のいくつかの実装とは異なり、このアプローチは追加のオーバーヘッドを負いません。
  • 構文的に簡潔:構文は読みやすいように設計されています。
  • 柔軟性:延期ブロックには、有効なcステートメントまたは式を含めることができます。 &&&&]
  • local deferrerオブジェクトの名前は、名前空間汚染を避けるために_の代わりにzz_で始まります。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3