1

参考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 下编译和运行。但是对于后者,宏的所有使用都会导致空字符串,我对为什么以及如何修复它感到非常傻眼......?

4

1 回答 1

2

不幸的是,我无法使用 MSVC 编译器进行测试。

在我过去使用微软工具的经验中,微软似乎将语言定义和标准视为一个粗略的指南。(我在项目上浪费了很多时间,却发现微软用 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;

试着看看事情在什么时候停止工作。然后从那里解决问题。

于 2009-01-29T20:19:04.757 回答