E 'particolarmente difficile per aggiungere un manipolatore ad un C++ flusso, come si ha alcun controllo su come viene utilizzato il manipolatore. Si può inserire una nuova localizzazione in uno stream, che ha un aspetto installato che controlla come vengono stampati i numeri - ma non come vengono prodotte le stringhe. E poi il problema sarebbe ancora come memorizzare lo stato di quotazione in modo sicuro nel flusso.
Le stringhe vengono emesse utilizzando un operatore definito nello spazio dei nomi std
. Se si desidera cambiare il modo in cui questi vengono stampate, pur mantenendo l'aspetto di manipolatori, è possibile creare una classe proxy:
namespace quoting {
struct quoting_proxy {
explicit quoting_proxy(std::ostream & os):os(os){}
template<typename Rhs>
friend std::ostream & operator<<(quoting_proxy const& q,
Rhs const& rhs) {
return q.os << rhs;
}
friend std::ostream & operator<<(quoting_proxy const& q,
std::string const& rhs) {
return q.os << "'" << rhs << "'";
}
friend std::ostream & operator<<(quoting_proxy const& q,
char const* rhs) {
return q.os << "'" << rhs << "'";
}
private:
std::ostream & os;
};
struct quoting_creator { } quote;
quoting_proxy operator<<(std::ostream & os, quoting_creator) {
return quoting_proxy(os);
}
}
int main() {
std::cout << quoting::quote << "hello" << std::endl;
}
Quale sarebbe adatto ad essere utilizzato per ostream
. Se si desidera generalizzare, è possibile renderlo anche un modello e accettare anche basic_stream
anziché il semplice string
. In alcuni casi ha comportamenti diversi rispetto ai manipolatori standard.Perché funziona restituendo l'oggetto proxy, non funzionerà per i casi come
std::cout << quoting::quote;
std::cout << "hello";
fonte
2009-02-11 06:29:25
Questo è quasi tre anni di ritardo, ma sai che è vulnerabile all'iniezione SQL, giusto? :) Spero che questo fosse solo un esempio arbitrario! – Geoff
@Geoff (Altri tre anni dopo) Ciò dipende interamente dall'implementazione di 'quote'. Può essere reso insensibile alle iniezioni SQL piuttosto banalmente. Non sceglierei questa particolare interfaccia, ma non è a priori non sicura. –