我试图想出一种巧妙的方法,将各种内容连接到函数的单个字符串参数中,而无需显式使用 ostringstream
。我想到了:
#define OSS(...) \
dynamic_cast<std::ostringstream const&>(std::ostringstream() << __VA_ARGS__).str()
但是,鉴于:
void f( string const &s ) {
cout << s << endl;
}
int main() {
char const *const s = "hello";
f( OSS( '{' << s << '}' ) );
ostringstream oss;
oss << '{' << s << '}';
cout << oss.str() << endl;
}
运行时打印:
123hello}
{hello}
其中 123 是
}
的 ASCII 码。为什么使用宏会出错?仅供引用:我目前在 Mac OS X 上使用 g++ 4.2.1 作为 Xcode 3.x 的一部分。
我现在正在使用的解决方案
class string_builder {
public:
template<typename T>
string_builder& operator,( T const &t ) {
oss_ << t;
return *this;
}
operator std::string() const {
return oss_.str();
}
private:
std::ostringstream oss_;
};
#define BUILD_STRING(...) (string_builder(), __VA_ARGS__)
using namespace std;
void f( string const &s ) {
cout << s << endl;
}
int main() {
char const *const s = "hello";
f( BUILD_STRING( '{', s, '}' ) );
}
最佳答案
一个更好的线程安全解决方案,不涉及繁琐的宏。
对函数的原始调用是这样的:
f( OSS( '{' << s << '}' ) );
如果电话只是这样呢:
f(stringbuilder() << '{' << s << '}' );
其中
stringbuilder
实现为:struct stringbuilder
{
std::ostringstream ss;
template<typename T>
stringbuilder & operator << (const T &data)
{
ss << data;
return *this;
}
operator string() { return ss.str(); }
};
void f( string const &s ) {
cout << s << endl;
}
测试:
int main() {
char const *const s = "hello";
f(stringbuilder() << '{' << s << '}' );
}
输出:
{hello}
在线演示:http://ideone.com/QHFf4
关于c++ - ostringstream 的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5666678/