C ++: возможно ли получить std :: string из объекта, который перегружает оператор <<? - PullRequest
3 голосов
/ 12 июля 2011

У меня есть объект, который можно вывести на консоль с помощью std::cout << obj, но я не могу получить std::string из него, потому что он, похоже, не реализует что-то вроде .string() метода. Я подумал, что смогу использовать этот перегруженный оператор, чтобы просто получить строковые представления всего, вместо того, чтобы реализовывать функцию, которая делает это самостоятельно каждый раз, когда мне это нужно, хотя, если ничего не найти по этому вопросу, я думаю, что это невозможно .

Ответы [ 3 ]

10 голосов
/ 12 июля 2011

Используйте std::ostringstream. Это реализация потока C ++, которая записывает в строку.

8 голосов
/ 12 июля 2011

Вы можете использовать std::ostringstream.

std::ostringstream os;
os << obj;
std::string result = os.str();
4 голосов
/ 12 июля 2011

Существуют разные способы сделать это, вы можете реализовать это вручную в терминах std::ostringstream или использовать предварительно упакованную версию в boost::lexical_cast.Для более сложных операций вы можете реализовать встроенный построитель строк, подобный тому, который я предоставил в качестве ответа здесь (это решает более сложную проблему построения общих строк, но если вы хотите проверить, этопростое общее решение).


Похоже, что связанный вопрос был удален из StackOverflow, поэтому я предоставлю основной скелет.Первое, что нужно сделать, это рассмотреть то, что мы хотим использовать со встроенным строителем строк, который в основном избегает необходимости создавать ненужные объекты:

void f( std::string const & x );
f( make_string() << "Hello " << name << ", your are " << age << " years old." );

Чтобы это работало, make_string() должен предоставитьобъект, который может использовать уже существующий operator<< для различных типов.И все выражение должно быть преобразовано в std::string.Базовая реализация довольно проста:

class make_string {
   std::ostringstream buffer;
public:
   template <typename T>
   make_string& operator<<( T const & obj ) {
      buffer << obj;
      return *this;
   }
   operator std::string() const {
      return buffer.str();
   }
};

Это обеспечивает большую часть реализации с наименьшим количеством кода.У него есть некоторые недостатки, например, он не требует манипуляторов (make_string() << std::hex << 30), для этого вы должны предоставить дополнительные перегрузки, которые принимают манипуляторы (указатели функций).Есть и другие небольшие проблемы с этой реализацией, большинство из которых можно преодолеть, добавив дополнительные перегрузки, но базовой реализации, описанной выше, достаточно для большинства обычных случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...