Поддержка const_string в операторе std :: ostream << - PullRequest
10 голосов
/ 20 апреля 2011

В настоящее время я использую очень умный пакет boost::const_string, пока http://libcxx.llvm.org/ не будет доступен предварительно упакованным в Ubuntu или GCC, сделав его __versa_string (в заголовке ext/vstring.h) своимреализация строки по умолчанию.std::string в libcxx, а также __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, как в * 1026.*.Я работаю на меня, но я не уверен, что это работает во всех случаях.Я что-то пропустил?

Ответы [ 3 ]

3 голосов
/ 21 апреля 2011

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

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

return o << std::basic_string<char_type, traits_type>(s.data(), s.size());
2 голосов
/ 20 апреля 2011

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

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

1 голос
/ 21 апреля 2011

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

...