Пользовательская реализация функции «Отложить» в 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
}
Преимущества:
Примечание:
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3