Встроенный макрос ostringstream перезагружен - PullRequest
1 голос
/ 29 января 2009

Ссылаясь на Макрос формата 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. Но с последним все случаи использования макроса приводят к пустым строкам, и я совершенно не понимаю, почему и как это исправить ...?

1 Ответ

2 голосов
/ 29 января 2009

К сожалению, у меня нет доступа к компилятору 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;

Попробуй посмотреть, в какой момент вещи перестают работать. Тогда обойдите проблему оттуда.

...