ventajas usar programa portable ejecutar desventajas como codelite code blocks c++ scope guard

c++ - usar - como ejecutar un programa en codeblocks



¿Dónde puedo encontrar una buena implementación de Scope Guard para mis proyectos de C++? (6)

Hace poco aprendí sobre el lenguaje Scope Guard C ++. Desafortunadamente no puedo encontrar ninguna buena implementación de ello.

¿Alguien puede indicarme alguna implementación buena y utilizable de Scope Guard en C ++?

Gracias, Boda Cydo.


Hay una propuesta para agregar scope_guard a la biblioteca estándar. Puede leer el documento, que incluye una implementación de ejemplo que puede copiar / pegar, here . Vea la sección 9.1 para la implementación.



La clase original de ScopeGuard está incluida en este artículo del Dr. Dobb por Andrei Alexandrescu y Petru Marginean. Una versión ligeramente mejorada, con algunos cambios de Joshua Lehrer está disponible here . (La versión de Lehrer es la que estoy usando en mis proyectos). También se incluye en la biblioteca Loki .

Boost ahora tiene una biblioteca de ScopeExit que es más poderosa que ScopeGuard (ya que puede ejecutar código arbitrario, mientras que ScopeGuard solo puede llamar a una única función preexistente).

Edit: Dicho todo esto, un Scope Guard es en realidad solo una aplicación específica de RAII, por lo que realmente debería al menos entender el concepto de cómo implementar uno.


ScopeGuard ha sido incluido en la biblioteca Loki (anunciado en Modern C ++ Design por Andrei Alexandrescu, estoy seguro de que has oído hablar de este gran libro) y es lo suficientemente maduro como para ser usado en el código de producción, imo.

Solo para ser claros: estamos hablando de escribir un código seguro de excepción usando RAII.

Lectura adicional (en ): ¿El uso de ScopeGuard realmente conduce a un mejor código?


Un objeto "Guardia de alcance" es solo una instancia del lenguaje RAII mucho más amplio.

Y no hay una implementación única de eso. Es algo que un programador de C ++ tiene que entender , no solo copiar / pegar. Por suerte, también es bastante trivial de implementar.

Se crea una clase que representa algún tipo de recurso. Cuando la clase está instanciada (por uno de sus constructores), debe adquirir el recurso y lanzar una excepción si eso falla. Cuando se destruye la clase, debe deshacerse del recurso, realizando toda la limpieza necesaria.

Y eso es. También tiene que manejar el constructor de copia y el operador de asignación (ya sea clonando el recurso o haciendo que estas dos funciones sean privadas para que nunca sean llamadas).

No necesita encontrar "una buena implementación", porque usted mismo escribirá docenas y docenas de implementaciones diferentes. Son triviales para escribir, y no pueden ser reutilizados fácilmente porque cada uno envuelve un tipo diferente de recurso.