重新加载内联 ostringstream 宏
Posted
技术标签:
【中文标题】重新加载内联 ostringstream 宏【英文标题】:Inline ostringstream macro reloaded 【发布时间】:2009-01-29 16:56:14 【问题描述】:参考C++ format macro / inline 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 编译器进行测试。
在我过去使用微软工具的经验中,微软似乎将语言定义和标准视为一个粗略的指南。 (我在项目上浪费了很多时间,却发现微软用 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;
试着看看什么时候停止工作。然后从那里解决问题。
【讨论】:
seekp() 是罪魁祸首。不确定 MSVC++ 对此有何不同,但将 ostringstream().seekp( 0, ios_base::cur ) 替换为 ostringstream()以上是关于重新加载内联 ostringstream 宏的主要内容,如果未能解决你的问题,请参考以下文章