«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как реализовать функцию «отложить» на C++, не полагаясь на библиотеки STL или Boost?

Как реализовать функцию «отложить» на C++, не полагаясь на библиотеки STL или Boost?

Опубликовано в 2025-01-27
Просматривать:176

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

Пример:

В следующем примере макрос defer используется в функции 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
}

Преимущества:

  • Нулевые накладные расходы: В отличие от некоторых других реализаций, этот подход не требует дополнительных накладных расходов.
  • Синтаксически краткий: Синтаксис разработан так, чтобы его было легко читать и use.
  • Нулевые зависимости: Эта реализация не зависит от каких-либо внешних библиотек, что сокращает время компиляции.
  • Гибкость: Блок defer может содержать любой допустимый оператор C или выражение.

Примечание:

  • Имя локального объекта отсрочки начинается с zz_ вместо _, чтобы избежать загрязнения пространства имен.
  • Идентификаторы пользователей технически не должны начинаться с подчеркивания.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3