CXX95 Telegram 39
#madskillz

Обертка над потоком вывода 🌊

У каждой крупной компании (и в FAANG) есть своя реализации std::string и/или разных строковых утилит.

Много где, прежде чем вывести немного видоизмененную строку в поток вывода (это объект с оператором <<, например std::cout, std::stringstream), создается новая строка:

log << "Value is " << valueStr.Quote();

Метод Quote() создаст новую строку с кавычками " по бокам. Такой код встречается тысячами, и вредит перфомансу , но это удобнее, чем выводить бесконечные "\"".

Попробуем сделать по аналогии с std::boolalpha "флаг" для "бесплатного" вывода строки. Мы хотим, чтобы можно было писать так:
log << "Value is " << quote << valueStr;
И это было бы аналогично записи
log << "Value is " << '"' << valueStr << '"';

Как это можно сделать?
Пусть выражение ((объект потока) << quote) вернет объект TQuoteWrapper, а запись ((объект TQuoteWrapper) << str) вернет исходный поток с записанным туда str.

Для удобства будем работать со всеми типами потоков. Объект quote ничего не значит и нужен только для вышеуказанной записи.

inline constexpr struct{} quote;

template<typename TStream>
auto operator<<(TStream& stream, decltype(quote)) {
return TQuoteWrapper{stream};
}

Сам объект TQuoteWrapper имеет оператор <<, в котором записывает то, что нужно:
template<typename TArg>
TStream& operator<<(TArg&& arg) {
return Stream_ << '"' << std::forward<TArg>(arg) << '"';
}
По ссылке на godbolt можно посмотреть, что получилось 👍

Также можно сделать так, чтобы TQuoteWrapper эскейпил символы строки (например, заменял \" на \\\").
По ссылке на godbolt можно посмотреть, как я это сделал.

Другой подход к "бесплатному" выводу строки в нужном формате можно посмотреть в библиотеке abseil - Writing to Stream. В нем потоку отдается "легкий" объект:
std::cout << absl::StreamFormat("\"%s\"", valueStr);
Но есть и свои ограничения - нельзя по-полному перепахать строку (сделать escape символов) через printf-like аргумент
👍9



tgoop.com/cxx95/39
Create:
Last Update:

#madskillz

Обертка над потоком вывода 🌊

У каждой крупной компании (и в FAANG) есть своя реализации std::string и/или разных строковых утилит.

Много где, прежде чем вывести немного видоизмененную строку в поток вывода (это объект с оператором <<, например std::cout, std::stringstream), создается новая строка:

log << "Value is " << valueStr.Quote();

Метод Quote() создаст новую строку с кавычками " по бокам. Такой код встречается тысячами, и вредит перфомансу , но это удобнее, чем выводить бесконечные "\"".

Попробуем сделать по аналогии с std::boolalpha "флаг" для "бесплатного" вывода строки. Мы хотим, чтобы можно было писать так:
log << "Value is " << quote << valueStr;
И это было бы аналогично записи
log << "Value is " << '"' << valueStr << '"';

Как это можно сделать?
Пусть выражение ((объект потока) << quote) вернет объект TQuoteWrapper, а запись ((объект TQuoteWrapper) << str) вернет исходный поток с записанным туда str.

Для удобства будем работать со всеми типами потоков. Объект quote ничего не значит и нужен только для вышеуказанной записи.

inline constexpr struct{} quote;

template<typename TStream>
auto operator<<(TStream& stream, decltype(quote)) {
return TQuoteWrapper{stream};
}

Сам объект TQuoteWrapper имеет оператор <<, в котором записывает то, что нужно:
template<typename TArg>
TStream& operator<<(TArg&& arg) {
return Stream_ << '"' << std::forward<TArg>(arg) << '"';
}
По ссылке на godbolt можно посмотреть, что получилось 👍

Также можно сделать так, чтобы TQuoteWrapper эскейпил символы строки (например, заменял \" на \\\").
По ссылке на godbolt можно посмотреть, как я это сделал.

Другой подход к "бесплатному" выводу строки в нужном формате можно посмотреть в библиотеке abseil - Writing to Stream. В нем потоку отдается "легкий" объект:
std::cout << absl::StreamFormat("\"%s\"", valueStr);
Но есть и свои ограничения - нельзя по-полному перепахать строку (сделать escape символов) через printf-like аргумент

BY C++95


Share with your friend now:
tgoop.com/cxx95/39

View MORE
Open in Telegram


Telegram News

Date: |

“Hey degen, are you stressed? Just let it all out,” he wrote, along with a link to join the group. While the character limit is 255, try to fit into 200 characters. This way, users will be able to take in your text fast and efficiently. Reveal the essence of your channel and provide contact information. For example, you can add a bot name, link to your pricing plans, etc. Those being doxxed include outgoing Chief Executive Carrie Lam Cheng Yuet-ngor, Chung and police assistant commissioner Joe Chan Tung, who heads police's cyber security and technology crime bureau. Your posting frequency depends on the topic of your channel. If you have a news channel, it’s OK to publish new content every day (or even every hour). For other industries, stick with 2-3 large posts a week. fire bomb molotov November 18 Dylan Hollingsworth yau ma tei
from us


Telegram C++95
FROM American