stl — потоковые строковые литералы в переполнении стека

Допустим, у меня есть некоторый внутренний фреймворк для файлов и потоков. я имею IOutputStream интерфейс класса с write(char const *buffer, size_t size) а также flush(), У меня есть инструмент, который называется Printer который может быть использован с любым экземпляром IOutputStream потомки. Тогда у меня есть Printer & operator<<(T x) методы стиля, где T x это данные (или ссылка или указатель на них) для записи.

Например Printer & operator<<(int x) переведу x в строку, и будет вызывать ссылочный выходной поток write(...) функция по-настоящему.

Давайте посмотрим на проблему! Призвание: printer << "appletree";, Это вызывает Printer & operator<<(char const *s), Для такого использования я должен позвонить strlen(s) определить размер, и после этого я могу назвать последний шаг. Это довольно безумно, так как я знаю длину appletree во время компиляции.

Есть ли хорошая практика для этого? Как STL ostream играет с титралами?

3

Решение

Поскольку строковые литералы имеют тип const char(&)[]Вы можете добавить перегрузку для них:

template<size_t n>
Printer& operator<<(const char (&cstring)[n]) {
write(cstring, n - 1);
}
6

Другие решения

Как насчет

template<std::size_t Size>
Printer& operator << (const char (&s)[Size]);
3

По вопросам рекламы [email protected]