"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como você pode implementar um recurso "adiar" em C++ sem depender de bibliotecas STL ou Boost?

Como você pode implementar um recurso "adiar" em C++ sem depender de bibliotecas STL ou Boost?

Publicado em 2025-01-27
Navegar:508

How can you implement a \

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:

  • Sobrecarga zero: Ao contrário de algumas outras implementações, esta abordagem não incorre em nenhuma sobrecarga adicional.
  • Sintaticamente conciso: A sintaxe foi projetada para ser fácil de ler e use.
  • Zero dependências: Esta implementação não depende de nenhuma biblioteca externa, reduzindo o tempo de compilação.
  • Flexível: O bloco defer pode conter qualquer declaração ou expressão C válida.

Observação:

  • O adiador local o nome do objeto começa com zz_ em vez de _ para evitar poluição do namespace.
  • Os identificadores de usuário não devem tecnicamente começar com um sublinhado.
Tutorial mais recente Mais>

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