Implementação personalizada de um recurso "Adiar" em C
Em C, o conceito de "adiar" envolve a execução de ações específicas no final de um escopo ou bloco de código específico. Embora as bibliotecas STL (Standard Template Library) e Boost não forneçam uma implementação integrada desse recurso, uma solução personalizada pode ser criada usando o seguinte snippet de código:
#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
Uso:
A macro defer pode ser usada dentro de um escopo específico para definir um bloco de código que será executado quando esse escopo terminar. A sintaxe é a seguinte:
defer {
// Code to be executed at the end of the current scope
};
Exemplo:
No exemplo a seguir, a macro defer é usada na função read_entire_file para fechar automaticamente o arquivo de entrada quando a função é encerrada:
#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
}
Benefícios:
Observação:
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3