Следующий макрос не так компактен, как одноразовый ostringstream
или boost::lexical_cast
.
Но если вам требуется многократное преобразование в строку, этот макрос более элегантен виспользовать, чем непосредственно обработку потоков строк или явное приведение каждый раз.
Он также очень универсален, поскольку он преобразует все , поддерживаемое operator<<()
, даже в комбинации.1012 *
Определение:
#include <sstream>
#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
( std::ostringstream() << std::dec << x ) ).str()
Объяснение:
std::dec
- это способ без побочных эффектов сделать анонимного ostringstream
вуниверсальная ostream
функция поиска operator<<()
работает корректно для всех типов.(В противном случае у вас могут возникнуть проблемы, если первый аргумент относится к типу указателя.)
dynamic_cast
возвращает тип обратно в ostringstream
, поэтому вы можете вызвать str()
для него.
Использование:
#include <string>
int main()
{
int i = 42;
std::string s1 = SSTR( i );
int x = 23;
std::string s2 = SSTR( "i: " << i << ", x: " << x );
return 0;
}