C での「遅延」機能のカスタム実装
C では、「遅延」の概念には、最後に特定のアクションを実行することが含まれます。特定のスコープまたはコードブロックの。 STL (標準テンプレート ライブラリ) および Boost ライブラリはこの機能の組み込み実装を提供していませんが、次のコード スニペットを使用してカスタム ソリューションを作成できます:
<code class="cpp">#ifndef defer struct defer_dummy {}; template <class F> struct deferrer { F f; ~deferrer() { f(); } }; template <class F> deferrer<F> 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</code>
使用法:
遅延マクロは、特定のスコープ内で使用して、そのスコープの終了時に実行されるコードのブロックを定義できます。構文は次のとおりです。
<code class="cpp">defer { // Code to be executed at the end of the current scope };</code>
例:
次の例では、遅延マクロが read_entire_file 関数内で使用され、次の場合に入力ファイルを自動的に閉じます。関数の終了:
<code class="cpp">#include <cstdlib> #include <cstdio> 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 }</code>
利点:
注:
以上がSTL や Boost ライブラリに依存せずに C で「延期」機能を実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。