[EDIT:. «True семантика манипулятора» (то есть упорная со ссылкой на состояние) также может быть достигнуто за счет упаковка в std::ostream
, а не вытекающие из нее, как было отмечено Benoit в комментарии]
Насколько я знаю, это невозможно сделать непосредственно, не вызывая новый класс от std::ostream
или аналогичный, или обертывание такого класса в другой класс, который пересылает большинство методов в его содержащийся объект std::ostream
. Это потому, что для примера кода, который вы предоставляете для работы, вам нужно каким-то образом изменить поведение std::ostream& operator<<(std::ostream&, std::string const&)
, которое определено где-то в иерархии iostreams (или, возможно, везде, где определено std::string
). Вам также нужно будет использовать (несколько уродливые) объекты в ios_base
для записи булевского флага с текущим состоянием цитирования. Посмотрите ios_base::xalloc()
, ios_base::iword()
и ios_base::pword()
, чтобы узнать, как это сделать.
Однако, если вы готовы использовать следующий синтаксис:
os << "SELECT * FROM customers WHERE name = " << quote(name);
Это может быть сделано очень просто с помощью глобальной функции (в соответствующем пространстве имен, конечно).
Этот синтаксис имеет то преимущество, что цитирование не является постоянным, то есть он не может «просачиваться», когда функция устанавливает флаг форматирования quote
и забывает вернуть его к исходному значению.
Это уже почти три года, но вы знаете, что это уязвимо для SQL-инъекции, верно? :) Надеюсь, это был просто произвольный пример! – Geoff
@ Geoff (Еще три года спустя) Это полностью зависит от реализации «quote». Это может быть непроницаемо для SQL-инъекций довольно тривиально. Я бы не выбрал этот конкретный интерфейс, но он не является априорным небезопасным. –