2010-08-12 9 views
17

Acabo de enterarme del modismo de Scope Guard C++. Lamentablemente, no puedo encontrar una buena implementación de la misma.¿Dónde puedo encontrar una buena implementación de Scope Guard para mis proyectos en C++?

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

Gracias, Boda Cydo.

+0

Nunca escuché hablar de esto antes - para otros me mienten, vea http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Scope_Guard. Parece poco probable que sea muy útil, en mi humilde opinión. Y es trivial de implementar: no necesita "encontrar una implementación". –

+0

@Neil: interesante porque es muy diferente de lo que esperaría de un modismo relacionado con RAII. Me pregunto quién maneja el recurso después de una ejecución exitosa. –

+0

@Matthieu Me también. No puedo ver lo que esto tiene sobre los indicadores inteligentes, a excepción de las posibilidades adicionales de errores. –

Respuesta

8

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

Para que quede claro: Estamos hablando de escribir código de excepción de excepción utilizando RAII.

Lectura adicional (en StackOverflow): Does ScopeGuard use really lead to better code?

+0

Sí, he oído hablar sobre Modern C++ Design. ¡Pero no he leído este libro porque es muy difícil de entender! Tal vez entiendo una oración en cada página. :) – bodacydo

+0

@boda En realidad, creo que está escrito con bastante claridad. Creo que el problema es que él no siempre hace explícitas las motivaciones para hacer lo que él está hablando, sino que espera que las conozcas. –

+1

Encontré el diseño moderno de C++ difícil al principio, pero después de leer un tutorial sobre Haskell y volver a leer cosas sobre plantillas, lo entendí bien y, en retrospectiva, no sé qué debería haber hecho de manera diferente. Sigue volviendo, es un libro realmente bueno – odinthenerd

0

Un objeto "Guardia Alcance" es sólo un ejemplo de la más amplia RAII idioma.

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

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

Y ... eso es todo. También debe manejar el constructor de copias y el operador de asignación (clonando el recurso o haciendo que estas dos funciones sean privadas para que nunca se llamen).

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

+0

Gracias, jalf, intentaré escribir la mía. Muchacho, ¿va a ser un ejercicio difícil para mí? ¡Nunca soñé con escribir un código tan complejo! – bodacydo

+9

La ventaja de una buena clase de Scope Guard es que hace que sea fácil llamar al código arbitrario en la limpieza, sin tener que escribir docenas y docenas de implementaciones diferentes usted mismo. –

14

La clase ScopeGuard original está incluida en this Dr. Dobb's article 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 está incluida en la biblioteca Loki.

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

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

+0

Desde que se escribió esta respuesta, salió C++ 11, y después de esto, un nuevo ScopeGuard, mucho mejor que antes; considere desaprobar su respuesta a favor de [este] (http://stackoverflow.com/a/30652029/1593077) por @MikeEllery. – einpoklum

0

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

Cuestiones relacionadas