Встроенный макрос ostringstream перезагружен

Ссылаясь на макрос формата C ++ / встроенный ostringstream

Вопрос был для макроса, который позволяет встроить объединение объектов для создания строки в стиле iostream.

Ответ был такой:

#define SSTR( x ) dynamic_cast< std::ostringstream & >( \
        ( std::ostringstream().seekp( 0, std::ios_base::cur ) << x ) \
    ).str()

Использование (например):

throw std::runtime_error(
        SSTR( "FooBar error: Value " << x << " exceeds " << y )
);

Это прекрасно работает - с GCC. Он также компилируется и работает под Visual C ++ 2005. Но с последним все использования макроса приводят к пустым строкам, и я совершенно ошеломлен относительно того, почему и как это исправить ...?


person DevSolar    schedule 29.01.2009    source источник


Ответы (1)


К сожалению, у меня нет доступа к компилятору MSVC для тестирования.

В моем прошлом опыте работы с инструментами Microsoft мне показалось, что Microsoft рассматривает определения и стандарты языка как не более чем приблизительное руководство. (Я потерял много времени на проектах только для того, чтобы обнаружить, что Microsoft нарушила традицию с помощью чего-то столь же простого, как C99.)

Учитывая эту прискорбную ситуацию, я предлагаю вам поэкспериментировать с серией тривиальных программ. Вещи как:

std::ostringstream() o;
o.seekp( 0, std::ios_base::cur ) << "foo";
cout << "Test1:  " << o << endl;

Или возможно:

std::ostringstream() o;
cout << "Test2:  " << typeid(o).name() << endl;
cout << "Test3:  " << typeid(o.seekp( 0, std::ios_base::cur )).name() << endl;

Попытайтесь увидеть, в какой момент все перестает работать. Затем устраните проблему оттуда.

person Mr.Ree    schedule 29.01.2009
comment
seekp () был виновником. Не уверен, что MSVC ++ делает по-другому с этим, но замена ostringstream (). Seekp (0, ios_base :: cur) на ostringstream () ‹< std :: dec (как предлагается cadabra) работает для MSVC ++. Я оставил заметку по исходному вопросу, чтобы другие не попались им. - person DevSolar; 30.01.2009