[EDIT:. "TRUE semántica manipulador" (es decir, un estado citando persistente) también podría lograrse mediante envolver un std::ostream
en lugar de derivados de ella, como se ha señalado por Benôit en los comentarios]
Por lo que yo sé, esto no se puede hacer directamente sin derivar una nueva clase de std::ostream
o similar, o envolviendo dicha clase en otra clase que reenvía la mayoría de los métodos a su objeto std::ostream
contenido. Esto se debe a que, para el ejemplo de código que proporcione al trabajo, deberá modificar de alguna manera el comportamiento de std::ostream& operator<<(std::ostream&, std::string const&)
, que se define en algún lugar de la jerarquía iostreams (o posiblemente donde esté definido std::string
). También necesitará usar las instalaciones (un tanto feas) en ios_base
para registrar una bandera booleana que tenga el estado actual de comillas. Consulte ios_base::xalloc()
, ios_base::iword()
y ios_base::pword()
para averiguar cómo hacerlo.
Sin embargo, si usted está dispuesto a utilizar la siguiente sintaxis:
os << "SELECT * FROM customers WHERE name = " << quote(name);
Esto se puede hacer de manera muy sencilla utilizando una función global (en un espacio de nombre adecuado, por supuesto).
Esta sintaxis tiene la ventaja de que la cotización no es persistente, lo que significa que no puede "filtrarse" cuando una función establece el indicador de formato quote
y olvida volver a establecer su valor original.
Esto es casi tres años demasiado tarde, pero usted sabe que es vulnerable a la inyección de SQL, ¿verdad? :) ¡Espero que esto sea solo un ejemplo arbitrario! – Geoff
@Geoff (Otro tres años más tarde) Eso depende completamente de la implementación de 'quote'. Puede hacerse impermeable a las inyecciones de SQL de manera bastante trivial. No elegiría esta interfaz en particular, pero no es a priori insegura. –