Встроенный макрос 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. Но с последним все случаи использования макроса приводят к пустым строкам, и я совершенно не понимаю, почему и как это исправить...?
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;
Постарайтесь увидеть, в какой момент все перестает работать. Тогда обойдите проблему оттуда.