Существуют разные способы сделать это, вы можете реализовать это вручную в терминах 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
), для этого вы должны предоставить дополнительные перегрузки, которые принимают манипуляторы (указатели функций).Есть и другие небольшие проблемы с этой реализацией, большинство из которых можно преодолеть, добавив дополнительные перегрузки, но базовой реализации, описанной выше, достаточно для большинства обычных случаев.