Поддержка const_string в операторе std:: ostream <<

В настоящее время я использую очень умный пакет boost::const_string до http://libcxx.llvm.org/ доступен, предварительно упакованный в Ubuntu или GCC, делает его __versa_string (в заголовке ext/vstring.h) своей реализацией строки по умолчанию. libcxx std::string, а __versa_string по умолчанию использует оптимизацию _small-string (SSO). Однако поддержка по умолчанию для вывода на std::ostream отсутствует. Код

#include <iostream>
#include <boost/const_string.hpp>

const_string<char> x;
std::cout << x << endl;

не работает, если мы не введем x в c-строку через c_str(), которая становится

std::cout << x.c_str() << endl;

который компилируется и работает так, как ожидалось. Я добавил следующую строку в const_string.hpp

template <typename T>
inline std::ostream & operator << (std::ostream & os, const boost::const_string<T> & a)
{
    return os.write(a.data(), a.size());
}

Это должно повысить производительность по сравнению с x.c_str(), потому что size() уже известен и не нуждается в вычислении путем поиска NULL, как в c_str(). Я работаю для меня, но я не уверен, работает ли он во всех случаях. Я что-то пропустил?

Ответ 1

Я что-то пропустил?

Да, просто включите const_string/io.hpp. Все, что он делает, это:

return o << std::basic_string<char_type, traits_type>(s.data(), s.size());

Ответ 2

Похоже, что это может иметь последствия, основанные на локали и/или гранях, применяемых к потоку для строк, и просто записывать прямые данные, как вы это делаете.

Это будет менее результативно, но как насчет создания std::string из const_string и использования << для вставки этого в поток?

Ответ 3

Нет (вы ничего не пропустили, afaik). Если ваша цель - не копировать содержимое, str.data() - это путь.