我正在尝试编写一个允许我执行类似操作的宏:FORMAT(a << "b" << c << d)
,结果将是一个字符串 - 与创建 ostringstream、插入a...d
和返回相同.str()
。就像是:
string f(){
ostringstream o;
o << a << "b" << c << d;
return o.str()
}
本质上,FORMAT(a << "b" << c << d) == f()
.
首先,我试过:
1: #define FORMAT(items) \
((std::ostringstream&)(std::ostringstream() << items)).str()
如果第一项是 C 字符串 ( const char *
),它将以十六进制打印字符串的地址,并且下一项将正常打印。如果第一项是 an std::string
,它将无法编译(没有匹配的 operator <<
)。
这:
2: #define FORMAT(items) \
((std::ostringstream&)(std::ostringstream() << 0 << '\b' << items)).str()
给出看似正确的输出,但0
and\b
当然存在于字符串中。
以下似乎有效,但编译时带有警告(获取临时地址):
3: #define FORMAT(items) \
((std::ostringstream&)(*((std::ostream*)(&std::ostringstream())) << items)).str()
有谁知道为什么 1 打印 c-string 的地址并且无法使用std::string
? 1和3本质上不是一样的吗?
我怀疑 C++0x 可变参数模板将成为format(a, "b", c, d)
可能。但是现在有办法解决这个问题吗?