」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在不依賴 STL 或 Boost 函式庫的情況下在 C++ 中實現「延遲」功能?

如何在不依賴 STL 或 Boost 函式庫的情況下在 C++ 中實現「延遲」功能?

發佈於2025-01-27
瀏覽:578

How can you implement a \

C 中“延遲”功能的自定義實現

在C 中,“延遲”的概念涉及在最後執行特定操作特定範圍或代碼塊的。雖然 STL(標準模板庫)和 Boost 庫不提供此功能的內置實現,但可以使用以下代碼片段創建自定義解決方案:

#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

用法:

defer 宏可以在特定範圍內使用,以定義當該範圍結束時將執行的代碼塊。語法如下:

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

示例:

在以下示例中,在read_entire_file 函數中使用defer 宏,以便在函數退出時自動關閉輸入文件:

#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
}

優點:

  • 零開銷:與其他一些實現不同,這種方法不會產生任何額外的開銷。
  • 語法簡潔:語法設計為易於閱讀和使用。
  • 零依賴:此實現不依賴任何外部庫,減少編譯時間。
  • 靈活: defer塊可以包含任何有效的C 語句或表達式.

注意:

  • 本地deferrer對象的名稱以zz_而不是_開頭,以避免命名空間污染。
  • 從技術上講,用戶標識符不應以下劃線開頭。
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3