Допустим, у меня есть некоторый внутренний фреймворк для файлов и потоков. я имею 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
играет с титралами?
Поскольку строковые литералы имеют тип const char(&)[]
Вы можете добавить перегрузку для них:
template<size_t n>
Printer& operator<<(const char (&cstring)[n]) {
write(cstring, n - 1);
}
Как насчет
template<std::size_t Size>
Printer& operator << (const char (&s)[Size]);