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
#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
}
ゼロオーバーヘッド:
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3