[РЕДАКТИРОВАТЬ: "Истинная семантика манипулятора" (т. Е. Состояние постоянного цитирования) также может быть достигнута с помощью обтекания std::ostream
, а не производного от него, как отметил Бенуа в комментариях .]
Насколько мне известно, это не может быть сделано напрямую без извлечения нового класса из 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
и забывает установить его обратно в исходное значение.