我试图想出一种聪明的方法来将各种事物连接成一个函数的单个字符串参数,而不必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, '}' ) );
}